add function

This commit is contained in:
jyuesong
2022-01-17 14:21:41 +08:00
parent 96b9d720a5
commit c7b98a04db
23 changed files with 807 additions and 105 deletions

View File

@@ -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,
),
),
),
);

View File

@@ -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]});
}
}

View File

@@ -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(

View File

@@ -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);
}),
),

View File

@@ -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 {

View File

@@ -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,
),
),

View File

@@ -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();