mirror of
https://github.com/qinglong-app/qinglong_app.git
synced 2025-10-09 16:48:19 +08:00
add function
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
import 'package:code_editor/code_editor.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/common_dialog.dart';
|
||||
import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/theme.dart';
|
||||
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/qinglong_theme.dart';
|
||||
|
||||
class ConfigEditPage extends ConsumerStatefulWidget {
|
||||
final String content;
|
||||
@@ -21,34 +20,23 @@ class ConfigEditPage extends ConsumerStatefulWidget {
|
||||
class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
||||
String? value;
|
||||
|
||||
late TextEditingController _controller;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_controller = TextEditingController(text: widget.content);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<FileEditor> files = [
|
||||
FileEditor(
|
||||
name: widget.title,
|
||||
language: "sh",
|
||||
code: widget.content, // [code] needs a string
|
||||
),
|
||||
];
|
||||
EditorModel editMode = EditorModel(
|
||||
files: files,
|
||||
styleOptions: EditorModelStyleOptions(
|
||||
fontSize: 13,
|
||||
heightOfContainer: MediaQuery.of(context).size.height - kToolbarHeight - kBottomNavigationBarHeight - 150,
|
||||
editorBorderColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
editButtonBackgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
editorColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
theme: qinglongLightTheme,
|
||||
),
|
||||
|
||||
);
|
||||
return Scaffold(
|
||||
appBar: QlAppBar(
|
||||
canBack: true,
|
||||
backCall: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
title: '编辑文件',
|
||||
title: '编辑${widget.title}',
|
||||
actions: [
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
@@ -56,7 +44,7 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
||||
failDialog(context, "请先点击保存");
|
||||
return;
|
||||
}
|
||||
HttpResponse<NullResponse> response = await Api.saveFile(widget.title, value!);
|
||||
HttpResponse<NullResponse> response = await Api.saveFile(widget.title, _controller.text);
|
||||
if (response.success) {
|
||||
ref.read(configProvider).loadContent(widget.title);
|
||||
Navigator.of(context).pop();
|
||||
@@ -76,13 +64,21 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
||||
],
|
||||
),
|
||||
body: Container(
|
||||
child: CodeEditor(
|
||||
model: editMode,
|
||||
edit: true,
|
||||
onSubmit: (title, v) {
|
||||
value = v;
|
||||
},
|
||||
disableNavigationbar: false,
|
||||
padding: const EdgeInsets.only(
|
||||
left: 15,
|
||||
right: 15,
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: TextField(
|
||||
focusNode: FocusNode(),
|
||||
style: TextStyle(
|
||||
color: ref.read(themeProvider).themeColor.descColor(),
|
||||
fontSize: 14,
|
||||
),
|
||||
controller: _controller,
|
||||
minLines: 1,
|
||||
maxLines: 100,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/base_state_widget.dart';
|
||||
import 'package:code_editor/code_editor.dart';
|
||||
import 'package:qinglong_app/base/code_editor/code_editor.dart';
|
||||
import 'package:qinglong_app/base/code_editor/EditorModel.dart';
|
||||
import 'package:qinglong_app/base/code_editor/EditorModelStyleOptions.dart';
|
||||
import 'package:qinglong_app/base/code_editor/FileEditor.dart';
|
||||
import 'package:qinglong_app/base/http/url.dart';
|
||||
import 'package:qinglong_app/base/routes.dart';
|
||||
import 'package:qinglong_app/base/theme.dart';
|
||||
import 'package:qinglong_app/utils/qinglong_theme.dart';
|
||||
import 'package:qinglong_app/main.dart';
|
||||
|
||||
import 'config_viewmodel.dart';
|
||||
|
||||
@@ -10,10 +16,12 @@ class ConfigPage extends StatefulWidget {
|
||||
const ConfigPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_ConfigPageState createState() => _ConfigPageState();
|
||||
ConfigPageState createState() => ConfigPageState();
|
||||
}
|
||||
|
||||
class _ConfigPageState extends State<ConfigPage> {
|
||||
class ConfigPageState extends State<ConfigPage> {
|
||||
GlobalKey<CodeEditorState> globalKey = GlobalKey();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BaseStateWidget<ConfigViewModel>(
|
||||
@@ -31,6 +39,7 @@ class _ConfigPageState extends State<ConfigPage> {
|
||||
files: files,
|
||||
styleOptions: EditorModelStyleOptions(
|
||||
fontSize: 13,
|
||||
editorNormalFilenameColor: ref.read(themeProvider).themeColor.descColor(),
|
||||
heightOfContainer: MediaQuery.of(context).size.height - kToolbarHeight - kBottomNavigationBarHeight - 90,
|
||||
editorBorderColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
editButtonBackgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
@@ -40,6 +49,7 @@ class _ConfigPageState extends State<ConfigPage> {
|
||||
),
|
||||
);
|
||||
return CodeEditor(
|
||||
key: globalKey,
|
||||
model: editMode,
|
||||
edit: false,
|
||||
disableNavigationbar: false,
|
||||
@@ -51,4 +61,11 @@ class _ConfigPageState extends State<ConfigPage> {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void editMe(WidgetRef ref) {
|
||||
int index = globalKey.currentState?.getCurrentIndex() ?? 0;
|
||||
|
||||
navigatorState.currentState?.pushNamed(Routes.route_ConfigEdit,
|
||||
arguments: {"title": ref.read(configProvider).list[index].title, "content": ref.read(configProvider).content[ref.read(configProvider).list[index].title]});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,19 +9,21 @@ import 'package:qinglong_app/module/env/env_page.dart';
|
||||
import 'package:qinglong_app/module/others/other_page.dart';
|
||||
import 'package:qinglong_app/module/task/task_page.dart';
|
||||
|
||||
class HomePage extends StatefulWidget {
|
||||
class HomePage extends ConsumerStatefulWidget {
|
||||
const HomePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_HomePageState createState() => _HomePageState();
|
||||
}
|
||||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
class _HomePageState extends ConsumerState<HomePage> {
|
||||
int _index = 0;
|
||||
String _title = "";
|
||||
|
||||
List<IndexBean> titles = [];
|
||||
|
||||
GlobalKey<ConfigPageState> configKey = GlobalKey();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
initTitles();
|
||||
@@ -52,6 +54,20 @@ class _HomePageState extends State<HomePage> {
|
||||
),
|
||||
),
|
||||
));
|
||||
} else if (_index == 2) {
|
||||
actions.add(InkWell(
|
||||
onTap: () {
|
||||
configKey.currentState?.editMe(ref);
|
||||
},
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 15,
|
||||
),
|
||||
child: Center(
|
||||
child: Text("编辑"),
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
actions.add(
|
||||
@@ -72,11 +88,13 @@ class _HomePageState extends State<HomePage> {
|
||||
),
|
||||
body: IndexedStack(
|
||||
index: _index,
|
||||
children: const [
|
||||
TaskPage(),
|
||||
EnvPage(),
|
||||
ConfigPage(),
|
||||
OtherPage(),
|
||||
children: [
|
||||
const TaskPage(),
|
||||
const EnvPage(),
|
||||
ConfigPage(
|
||||
key: configKey,
|
||||
),
|
||||
const OtherPage(),
|
||||
],
|
||||
),
|
||||
bottomNavigationBar: BottomNavigationBar(
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/common_dialog.dart';
|
||||
import 'package:qinglong_app/base/routes.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/main.dart';
|
||||
import 'package:qinglong_app/module/login/login_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/utils.dart';
|
||||
@@ -16,7 +17,7 @@ class LoginPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<LoginPage> {
|
||||
final TextEditingController _hostController = TextEditingController(text: userInfoViewModel.host);
|
||||
final TextEditingController _hostController = TextEditingController(text: getIt<UserInfoViewModel>().host);
|
||||
final TextEditingController _userNameController = TextEditingController();
|
||||
final TextEditingController _passwordController = TextEditingController();
|
||||
|
||||
@@ -63,7 +64,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height / 6,
|
||||
height: MediaQuery.of(context).size.height / 10,
|
||||
),
|
||||
SizedBox(
|
||||
height: 50,
|
||||
@@ -72,7 +73,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
children: [
|
||||
Positioned(
|
||||
top: 0,
|
||||
left: 40,
|
||||
left: 0,
|
||||
child: Image.asset(
|
||||
"assets/images/login_tip.png",
|
||||
height: 45,
|
||||
@@ -80,7 +81,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
const Positioned(
|
||||
top: 10,
|
||||
left: 40,
|
||||
left: 0,
|
||||
child: Text(
|
||||
"登录",
|
||||
style: TextStyle(
|
||||
@@ -91,7 +92,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
Positioned(
|
||||
top: 5,
|
||||
right: 40,
|
||||
right: 0,
|
||||
child: Image.asset(
|
||||
"assets/images/ql.png",
|
||||
height: 45,
|
||||
@@ -197,7 +198,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
onPressed: () {
|
||||
Utils.hideKeyBoard(context);
|
||||
userInfoViewModel.updateHost(_hostController.text);
|
||||
getIt<UserInfoViewModel>().updateHost(_hostController.text);
|
||||
model.login(_userNameController.text, _passwordController.text);
|
||||
}),
|
||||
),
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:qinglong_app/base/base_viewmodel.dart';
|
||||
import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/http/url.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/main.dart';
|
||||
|
||||
import 'login_bean.dart';
|
||||
@@ -23,7 +24,7 @@ class LoginViewModel extends ViewModel {
|
||||
HttpResponse<LoginBean> response = await Api.login(userName, password);
|
||||
|
||||
if (response.success) {
|
||||
userInfoViewModel.updateToken(response.bean?.token ?? "");
|
||||
getIt<UserInfoViewModel>().updateToken(response.bean?.token ?? "");
|
||||
loginSuccess = true;
|
||||
isLoading = false;
|
||||
} else {
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:qinglong_app/base/base_state_widget.dart';
|
||||
import 'package:qinglong_app/base/routes.dart';
|
||||
import 'package:qinglong_app/base/theme.dart';
|
||||
import 'package:qinglong_app/base/ui/abs_underline_tabindicator.dart';
|
||||
import 'package:qinglong_app/base/ui/empty_widget.dart';
|
||||
import 'package:qinglong_app/base/ui/menu.dart';
|
||||
import 'package:qinglong_app/module/task/intime_log/intime_log_page.dart';
|
||||
import 'package:qinglong_app/module/task/task_bean.dart';
|
||||
@@ -83,23 +84,21 @@ class _TaskPageState extends State<TaskPage> {
|
||||
onRefresh: () async {
|
||||
return model.loadData(false);
|
||||
},
|
||||
child: ListView.builder(
|
||||
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
|
||||
itemBuilder: (context, index) {
|
||||
// if (index == 0) {
|
||||
// return searchCell(ref);
|
||||
// }
|
||||
child: list.isEmpty
|
||||
? const EmptyWidget()
|
||||
: ListView.builder(
|
||||
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
|
||||
itemBuilder: (context, index) {
|
||||
TaskBean item = list[index];
|
||||
|
||||
TaskBean item = list[index];
|
||||
|
||||
if ((item.name == null || item.name!.contains(_searchKey ?? "")) || (item.command == null || item.command!.contains(_searchKey ?? ""))) {
|
||||
return TaskItemCell(item, ref);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
},
|
||||
itemCount: list.length,
|
||||
),
|
||||
if ((item.name == null || item.name!.contains(_searchKey ?? "")) || (item.command == null || item.command!.contains(_searchKey ?? ""))) {
|
||||
return TaskItemCell(item, ref);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
},
|
||||
itemCount: list.length,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -239,13 +238,13 @@ class TaskItemCell extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Material(
|
||||
color:Colors.transparent,
|
||||
color: Colors.transparent,
|
||||
child: Text(
|
||||
bean.name ?? "",
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
color: bean.isDisabled == 1 ? Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(),
|
||||
color: bean.isDisabled == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(),
|
||||
fontSize: 18,
|
||||
),
|
||||
),
|
||||
@@ -264,13 +263,13 @@ class TaskItemCell extends StatelessWidget {
|
||||
),
|
||||
const Spacer(),
|
||||
Material(
|
||||
color:Colors.transparent,
|
||||
color: Colors.transparent,
|
||||
child: Text(
|
||||
(bean.lastExecutionTime == null || bean.lastExecutionTime == 0) ? "-" : Utils.formatMessageTime(bean.lastExecutionTime!),
|
||||
maxLines: 1,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
color: Color(0xff999999),
|
||||
color: ref.watch(themeProvider).themeColor.descColor(),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
@@ -281,13 +280,13 @@ class TaskItemCell extends StatelessWidget {
|
||||
height: 8,
|
||||
),
|
||||
Material(
|
||||
color:Colors.transparent,
|
||||
color: Colors.transparent,
|
||||
child: Text(
|
||||
bean.schedule ?? "",
|
||||
maxLines: 1,
|
||||
style: const TextStyle(
|
||||
style: TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
color: Color(0xff999999),
|
||||
color: ref.watch(themeProvider).themeColor.descColor(),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -33,6 +33,9 @@ class TaskViewModel extends BaseViewModel {
|
||||
list.sort((a, b) {
|
||||
return b.created!.compareTo(a.created!);
|
||||
});
|
||||
list.sort((a, b) {
|
||||
return b.isPinned!.compareTo(a.isPinned!);
|
||||
});
|
||||
running.clear();
|
||||
running.addAll(list.where((element) => element.status == 0));
|
||||
disabled.clear();
|
||||
|
||||
Reference in New Issue
Block a user