diff --git a/src/database.py b/src/database.py index 5e28c56..d5488c1 100644 --- a/src/database.py +++ b/src/database.py @@ -108,7 +108,7 @@ class CalendarDatabase(object): def tokenOper_is_admin(self, username): self.cursor.execute('SELECT [ccn_isAdmin] FROM user WHERE [ccn_name] = ?;',(username, )) cache = self.cursor.fetchone()[0] - return True if cache == 1 else False + return cache == 1 def tokenOper_get_username(self, token): self.cursor.execute('SELECT [ccn_user] FROM token WHERE [ccn_token] = ? AND [ccn_tokenExpireOn] > ?;',( @@ -239,35 +239,35 @@ class CalendarDatabase(object): # analyse opt arg reAnalyseLoop = False - cache = optArgs.get('belongTo', default=None) + cache = optArgs.get('belongTo', None) if cache is not None: sqlList.append('[ccn_belongTo] = ?') argumentsList.append(cache) - cache = optArgs.get('title', default=None) + cache = optArgs.get('title', None) if cache is not None: sqlList.append('[ccn_title] = ?') argumentsList.append(cache) - cache = optArgs.get('description', default=None) + cache = optArgs.get('description', None) if cache is not None: sqlList.append('[ccn_description] = ?') argumentsList.append(cache) - cache = optArgs.get('eventDateTimeStart', default=None) + cache = optArgs.get('eventDateTimeStart', None) if cache is not None: sqlList.append('[ccn_eventDateTimeStart] = ?') argumentsList.append(cache) reAnalyseLoop = True analyseData[5] = cache - cache = optArgs.get('eventDateTimeEnd', default=None) + cache = optArgs.get('eventDateTimeEnd', None) if cache is not None: sqlList.append('[ccn_eventDateTimeEnd] = ?') argumentsList.append(cache) - cache = optArgs.get('loopRules', default=None) + cache = optArgs.get('loopRules', None) if cache is not None: sqlList.append('[ccn_loopRules] = ?') argumentsList.append(cache) reAnalyseLoop = True analyseData[8] = cache - cache = optArgs.get('timezoneOffset', default=None) + cache = optArgs.get('timezoneOffset', None) if cache is not None: sqlList.append('[ccn_timezoneOffset] = ?') argumentsList.append(cache) @@ -486,7 +486,7 @@ class CalendarDatabase(object): @SafeDatabaseOperation def admin_get(self, token): username = self.tokenOper_get_username(token) - if not tokenOper_is_admin(username): + if not self.tokenOper_is_admin(username): raise Exception('Permission denied.') self.cursor.execute('SELECT [ccn_name], [ccn_isAdmin] FROM user;') @@ -495,7 +495,7 @@ class CalendarDatabase(object): @SafeDatabaseOperation def admin_add(self, token, newname): username = self.tokenOper_get_username(token) - if not tokenOper_is_admin(username): + if not self.tokenOper_is_admin(username): raise Exception('Permission denied.') newpassword = utils.ComputePasswordHash(utils.GenerateUUID()) @@ -508,9 +508,9 @@ class CalendarDatabase(object): return (newname, False) @SafeDatabaseOperation - def admin_update(self, token, username, **optArgs): + def admin_update(self, token, _username, **optArgs): username = self.tokenOper_get_username(token) - if not tokenOper_is_admin(username): + if not self.tokenOper_is_admin(username): raise Exception('Permission denied.') # construct data @@ -518,19 +518,21 @@ class CalendarDatabase(object): argumentsList = [] # analyse opt arg - cache = optArgs.get('password', default=None) + cache = optArgs.get('password', None) if cache is not None: sqlList.append('[ccn_password] = ?') argumentsList.append(utils.ComputePasswordHash(cache)) - cache = optArgs.get('isAdmin', default=None) + cache = optArgs.get('isAdmin', None) if cache is not None: sqlList.append('[ccn_isAdmin] = ?') argumentsList.append(1 if cache else 0) # execute - argumentsList.append(username) + argumentsList.append(_username) self.cursor.execute('UPDATE user SET {} WHERE [ccn_name] = ?;'.format(', '.join(sqlList)), tuple(argumentsList)) + print(cache) + print(tuple(argumentsList)) if self.cursor.rowcount != 1: raise Exception('Fail to update due to no matched rows or too much rows.') return True @@ -538,7 +540,7 @@ class CalendarDatabase(object): @SafeDatabaseOperation def admin_delete(self, token, username): _username = self.tokenOper_get_username(token) - if not tokenOper_is_admin(_username): + if not self.tokenOper_is_admin(_username): raise Exception('Permission denied.') # delete diff --git a/src/server.py b/src/server.py index 416884d..b447089 100644 --- a/src/server.py +++ b/src/server.py @@ -12,6 +12,7 @@ import os import config import database +import utils app = Flask(__name__) calendar_db = database.CalendarDatabase() @@ -289,7 +290,7 @@ def api_admin_updateHandle(): (('token', str, False), ('username', str, False), ('password', str, True), - ('isAdmin', bool, True))) + ('isAdmin', utils.Str2Bool, True))) @app.route('/api/admin/delete', methods=['POST']) def api_admin_deleteHandle(): diff --git a/src/static/i18n/strings_en-US.properties b/src/static/i18n/strings_en-US.properties index 50d214d..3cf6b88 100644 --- a/src/static/i18n/strings_en-US.properties +++ b/src/static/i18n/strings_en-US.properties @@ -17,7 +17,11 @@ ccn-messagebox-title=Notification ccn-js-fail-login=Fail to login. Please check your username or password. ccn-js-fail-logout=Fail to logout due to unknow reason. Consider refreshing page to solve problem. -ccn-js-fail-operate=An operation failed. It may caused by your input wrong data, or system error. Refreshing page may fix system problem. Before refreshing page, please backup all your unsaved data. +ccn-js-fail-get=A get operation failed. It may caused by server internal error or your limited permission. Refreshing page may fix system problem. Before refreshing page, please backup all your unsaved data. +ccn-js-fail-add=An add operation failed. It may caused by wrong arguments. Refreshing page may fix system problem. Before refreshing page, please backup all your unsaved data. +ccn-js-fail-update=An update operation failed. It may caused by wrong arguments or lost target. Refreshing page may fix system problem. Before refreshing page, please backup all your unsaved data. +ccn-js-fail-delete=A delete operation failed. It may caused by no matched item. Refreshing page may fix system problem. Before refreshing page, please backup all your unsaved data. +ccn-js-success=Operation OK. ccn-home-desc=
A light, self-host calendar system.
Originally, this app is served for yyc12345 personal use.
Pull request / issue / translation are welcomed.
Submit them in our GitHub project.
This project source code is licensed AGPL v3.
@@ -45,3 +49,10 @@ ccn-calendar-shared-list=Shared ccn-calendar-sharing-ownedList=Owned ccn-calendar-sharing-sharingTargetList=Sharing target ccn-calendar-sharing-sharingTargetEditing=Editing: + +ccn-admin-tabcontrol-tabProfile=My Profile +ccn-admin-tabcontrol-tabUserList=Manager User +ccn-admin-changePassword=Change Password +ccn-admin-userList=User List +ccn-admin-userItem-newPassword=New Password +ccn-admin-userItem-isAdmin=Is Admin diff --git a/src/static/i18n/strings_zh-CN.properties b/src/static/i18n/strings_zh-CN.properties index 7ad32c7..cb991d3 100644 --- a/src/static/i18n/strings_zh-CN.properties +++ b/src/static/i18n/strings_zh-CN.properties @@ -17,7 +17,11 @@ ccn-messagebox-title=通知 ccn-js-fail-login=登陆失败,请检查您的用户名和密码。 ccn-js-fail-logout=由于未知原因,登出失败,请考虑刷新页面解决问题。 -ccn-js-fail-operate=一个操作失败了,可能是您输入了错误的参数,又或者是系统错误。刷新页面可能会解决系统错误问题。请在刷新前备份好自己的数据。 +ccn-js-fail-get=一个获取操作失败了,可能是系统错误或者您的权限不足。刷新页面可能会解决问题。请在刷新页面前备份好自己的数据。 +ccn-js-fail-add=一个添加操作失败了,可能是您输入的参数有误。刷新页面可能会解决问题。请在刷新页面前备份好自己的数据。 +ccn-js-fail-update=一个更新操作失败了,可能是没有找到匹配的条目或者您的参数输入错误。刷新页面可能会解决问题。请在刷新页面前备份好自己的数据。 +ccn-js-fail-delete=一个删除操作失败了,可能是没有找到对应条目。刷新页面可能会解决问题。请在刷新页面前备份好自己的数据。 +ccn-js-success=操作成功 ccn-home-desc=一个轻量的自建日历系统
原本是出于yyc12345的个人使用而制作的。
欢迎提出Pull request / issue / 翻译
将他们提交到我们的GitHub项目.
本工程代码使用AGPL v3授权。
@@ -45,3 +49,11 @@ ccn-calendar-shared-list=被共享的集合 ccn-calendar-sharing-ownedList=我的集合 ccn-calendar-sharing-sharingTargetList=分享目标 ccn-calendar-sharing-sharingTargetEditing=正在编辑集合: + +ccn-admin-tabcontrol-tabProfile=我的资料 +ccn-admin-tabcontrol-tabUserList=管理用户 +ccn-admin-changePassword=更改密码 +ccn-admin-userList=用户列表 +ccn-admin-userItem-newPassword=新密码 +ccn-admin-userItem-isAdmin=是管理员 + diff --git a/src/static/js/api.js b/src/static/js/api.js index 5b83774..366b526 100644 --- a/src/static/js/api.js +++ b/src/static/js/api.js @@ -406,14 +406,18 @@ function ccn_api_admin_add(_username) { } function ccn_api_admin_update(_username, _password, _isAdmin) { - return ccn_api_dataTemplate( + var data = {}; + if (typeof(_password) != 'undefined') + data.password = _password; + if (typeof(_isAdmin) != 'undefined') + data.isAdmin = _isAdmin; + + if (Object.getOwnPropertyNames(data).length == 0) return false; + data.token = GetApiToken(); + data.username = _username; + return ccn_api_boolTemplate( '/api/admin/update', - { - token: GetApiToken(), - username: _username, - password: _password, - isAdmin: _isAdmin - } + data ); } diff --git a/src/static/js/headerNav.js b/src/static/js/headerNav.js index 4147849..04f9edf 100644 --- a/src/static/js/headerNav.js +++ b/src/static/js/headerNav.js @@ -29,6 +29,7 @@ function ccn_headerNav_BindEvents() { $("#ccn-header-language > *").each(function(){ $(this).click(function(){ ccn_i18n_ChangeLanguage($(this).attr("language")); + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); }); }); diff --git a/src/static/js/i18n.js b/src/static/js/i18n.js index aae0ed0..a2605ff 100644 --- a/src/static/js/i18n.js +++ b/src/static/js/i18n.js @@ -23,41 +23,48 @@ function ccn_i18n_ChangeLanguage(newLang) { return true; } -function ccn_i18n_ApplyLanguage() { +function ccn_i18n_LoadLanguage() { $.i18n.properties({ name: 'strings_' + ccn_i18n_currentLanguage, path: '/static/i18n/', encoding: 'utf-8', mode: 'map', - async: true, + async: false, cache: false, - language: ccn_i18n_currentLanguage, - callback: function() { - //set usual block - var cache = $("[i18n-name]"); - cache.each(function() { - $(this).html($.i18n.prop($(this).attr('i18n-name'))); - }); - - //set unusual block - //set title - switch(ccn_pages_currentPage) { - case ccn_pages_enumPages.home: - $('#ccn-pageName').html($.i18n.prop('ccn-pageName-home')); - break; - case ccn_pages_enumPages.calendar: - $('#ccn-pageName').html($.i18n.prop('ccn-pageName-calendar')); - break; - case ccn_pages_enumPages.todo: - $('#ccn-pageName').html($.i18n.prop('ccn-pageName-todo')); - break; - case ccn_pages_enumPages.admin: - $('#ccn-pageName').html($.i18n.prop('ccn-pageName-admin')); - break; - case ccn_pages_enumPages.login: - $('#ccn-pageName').html($.i18n.prop('ccn-pageName-login')); - break; - } - } + language: ccn_i18n_currentLanguage + }); +} + +function ccn_i18n_ApplyLanguage() { + //set usual block + var cache = $("[i18n-name]"); + cache.each(function() { + $(this).html($.i18n.prop($(this).attr('i18n-name'))); + }); + + //set unusual block + //set title + switch(ccn_pages_currentPage) { + case ccn_pages_enumPages.home: + $('#ccn-pageName').html($.i18n.prop('ccn-pageName-home')); + break; + case ccn_pages_enumPages.calendar: + $('#ccn-pageName').html($.i18n.prop('ccn-pageName-calendar')); + break; + case ccn_pages_enumPages.todo: + $('#ccn-pageName').html($.i18n.prop('ccn-pageName-todo')); + break; + case ccn_pages_enumPages.admin: + $('#ccn-pageName').html($.i18n.prop('ccn-pageName-admin')); + break; + case ccn_pages_enumPages.login: + $('#ccn-pageName').html($.i18n.prop('ccn-pageName-login')); + break; + } +} + +function ccn_i18n_ApplyLanguage2Content(ctx) { + ctx.find("[i18n-name]").each(function() { + $(this).html($.i18n.prop($(this).attr('i18n-name'))); }); } diff --git a/src/static/js/page/admin.js b/src/static/js/page/admin.js index 319e8a4..af959b3 100644 --- a/src/static/js/page/admin.js +++ b/src/static/js/page/admin.js @@ -1,3 +1,5 @@ +var ccn_admin_userListCache = []; + $(document).ready(function() { ccn_pages_currentPage = ccn_pages_enumPages.admin; @@ -13,6 +15,191 @@ $(document).ready(function() { ccn_messagebox_Insert(); ccn_messagebox_BindEvent(); + // bind tab control switcher and set current tab + $("#tabcontrol-tab-1-1").click(function(){ + ccn_tabcontrol_SwitchTab(1, 1); + }); + $("#tabcontrol-tab-1-2").click(function(){ + ccn_tabcontrol_SwitchTab(1, 2); + }); + ccn_tabcontrol_SwitchTab(1, 1); + + // load user tab according to admin status + if(!ccn_api_common_isAdmin()) + $('#tabcontrol-tab-1-2').hide(); + // apply i18n + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); -}); \ No newline at end of file + + // bind event + $('#ccn-admin-profile-btnChangePassword').click(ccn_admin_profile_ChangePassword); + $('#ccn-admin-userList-btnAdd').click(ccn_admin_userList_Add); + $('#ccn-admin-userList-btnRefresh').click(ccn_admin_userList_Refresh); +}); + +// ================== profile + +function ccn_admin_profile_ChangePassword() { + var newpassword = $('#ccn-admin-profile-inputPassword').val(); + if (newpassword == "") return; + + var result = ccn_api_common_changePassword(newpassword); + if(result) { + ccn_messagebox_Show($.i18n.prop("ccn-js-success")); + $('#ccn-admin-profile-inputPassword').val(''); + } else + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-update")); + +} + +// ================== user list + +function ccn_admin_userList_RefreshCacheList() { + ccn_admin_userListCache = new Array(); + + var result = ccn_api_admin_get(); + if(typeof(result) != 'undefined') { + for(var index in result) { + ccn_admin_userListCache[index] = result[index]; + } + } +} + +function ccn_admin_userList_RenderItem(item, index, listDOM, renderdata) { + var renderdata = { + uuid: index, // use index for uuid. there are no uuid for user + username: item[0] + } + + // render + listDOM.append(ccn_template_userItem.render(renderdata)); + + // set mode + var uuid = index; + ccn_admin_userList_ChangeDisplayMode(uuid, false, item[1]) + + // bind event + $("#ccn-admin-userItem-btnEdit-" + uuid).click(ccn_admin_userList_ItemEdit); + $("#ccn-admin-userItem-btnDelete-" + uuid).click(ccn_admin_userList_ItemDelete); + $("#ccn-admin-userItem-btnUpdate-" + uuid).click(ccn_admin_userList_ItemUpdate); + $("#ccn-admin-userItem-btnCancelUpdate-" + uuid).click(ccn_admin_userList_ItemCancelUpdate); +} + +function ccn_admin_userList_RenderCacheList() { + $('#ccn-admin-userList').empty(); + + var listDOM = $('#ccn-admin-userList'); + for(var index in ccn_admin_userListCache) { + ccn_admin_userList_RenderItem( + ccn_admin_userListCache[index], + index, + listDOM + ) + } + + ccn_i18n_ApplyLanguage2Content(listDOM); +} + +function ccn_admin_userList_ChangeDisplayMode(uuid, isEdit, isAdmin) { + if (typeof(isAdmin) != 'undefined') { + if (isAdmin) + $("#ccn-admin-userItem-iconIsAdmin-" + uuid).show(); + else + $("#ccn-admin-userItem-iconIsAdmin-" + uuid).hide(); + } + + if (typeof(isEdit) != 'undefined') { + if (isEdit) { + $("#ccn-admin-userItem-btnEdit-" + uuid).hide(); + $("#ccn-admin-userItem-btnDelete-" + uuid).hide(); + $("#ccn-admin-userItem-btnUpdate-" + uuid).show(); + $("#ccn-admin-userItem-btnCancelUpdate-" + uuid).show(); + + $("#ccn-admin-userItem-boxPassword-" + uuid).show(); + $("#ccn-admin-userItem-boxIsAdmin-" + uuid).show(); + } else { + $("#ccn-admin-userItem-btnEdit-" + uuid).show(); + $("#ccn-admin-userItem-btnDelete-" + uuid).show(); + $("#ccn-admin-userItem-btnUpdate-" + uuid).hide(); + $("#ccn-admin-userItem-btnCancelUpdate-" + uuid).hide(); + + $("#ccn-admin-userItem-boxPassword-" + uuid).hide(); + $("#ccn-admin-userItem-boxIsAdmin-" + uuid).hide(); + } + } +} + +function ccn_admin_userList_Refresh() { + // refresh and render once + ccn_admin_userList_RefreshCacheList(); + ccn_admin_userList_RenderCacheList(); +} + +function ccn_admin_userList_Add() { + var username = $('#ccn-admin-userList-inputUsername').val(); + if (username == "") return; + + var result = ccn_api_admin_add(username); + if (typeof(result) == 'undefined') { + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-add")); + } else { + // render + var index = ccn_admin_userListCache.push(result) - 1; + var listDOM = $('#ccn-admin-userList'); + ccn_admin_userList_RenderItem(result, index, listDOM); + ccn_i18n_ApplyLanguage2Content(listDOM); + } +} + +function ccn_admin_userList_ItemEdit() { + var uuid = $(this).attr("uuid"); + + // copy isAdmin to checkbox and clean password box + $('#ccn-admin-userItem-inputIsAdmin-' + uuid).prop("checked", ccn_admin_userListCache[uuid][1]); + $('#ccn-admin-userItem-inputPassword-' + uuid).val(''); + + // switch to edit mode + ccn_admin_userList_ChangeDisplayMode(uuid, true, undefined); +} + +function ccn_admin_userList_ItemDelete() { + var uuid = $(this).attr("uuid"); + + var result = ccn_api_admin_delete(ccn_admin_userListCache[uuid][0]); + + if(!result) { + // fail + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-delete")); + } else { + // remove body + $("#ccn-admin-userItem-" + uuid).remove(); + } +} + +function ccn_admin_userList_ItemUpdate() { + var uuid = $(this).attr("uuid"); + var newpassword = $('#ccn-admin-userItem-inputPassword-' + uuid).val(); + var isAdmin = $('#ccn-admin-userItem-inputIsAdmin-' + uuid).prop("checked"); + + var result = ccn_api_admin_update( + ccn_admin_userListCache[uuid][0], + newpassword == "" ? undefined : newpassword, + isAdmin == ccn_admin_userListCache[uuid][1] ? undefined : isAdmin); + + if (!result) { + // fail + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-update")); + } else { + // safely update data + ccn_admin_userListCache[uuid][1] = isAdmin + + // switch to normal mode + ccn_admin_userList_ChangeDisplayMode(uuid, false, isAdmin); + } +} + +function ccn_admin_userList_ItemCancelUpdate() { + var uuid = $(this).attr("uuid"); + ccn_admin_userList_ChangeDisplayMode(uuid, false, undefined); +} diff --git a/src/static/js/page/calendar.js b/src/static/js/page/calendar.js index 7d455f8..0bc5b52 100644 --- a/src/static/js/page/calendar.js +++ b/src/static/js/page/calendar.js @@ -1,3 +1,7 @@ +var ccn_calendar_sharingListCache = []; +var ccn_calendar_sharingTargetListCache = []; +var ccn_calendar_sharedListCache = []; + $(document).ready(function() { ccn_pages_currentPage = ccn_pages_enumPages.calendar; @@ -29,9 +33,54 @@ $(document).ready(function() { ccn_tabcontrol_SwitchTab(1, 1); // apply i18n + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); }); function ccn_calendar_LoadCalendarBody() { $('#ccn-calendar-calendarBbody').append(ccn_template_calendarItem.render()); } + +// ================== calendar + + +// ================== collection + +function ccn_calendar_sharing_Refresh() { + ccn_calendar_sharingListCache = new Array(); + + var result = ccn_api_collection_getFullOwn(); + if(typeof(result) != 'undefined') { + for(var index in result) { + ccn_calendar_sharingListCache[result[index][0]] = result[index]; + } + } + + // render + $('#ccn-admin-userList').empty(); + + var listDOM = $('#ccn-admin-userList'); + for(var index in ccn_admin_userListCache) { + ccn_admin_userList_RenderItem( + ccn_admin_userListCache[index], + index, + listDOM + ) + } +} + +function ccn_calendar_sharing_RenderItem() { + +} + +function ccn_calendar_sharingTarget_Refresh() { + +} + +function ccn_calendar_sharingTarget_RenderItem() { + +} + +function ccn_calendar_shared_Refresh() { + +} diff --git a/src/static/js/page/home.js b/src/static/js/page/home.js index dbc5116..220ff9c 100644 --- a/src/static/js/page/home.js +++ b/src/static/js/page/home.js @@ -14,5 +14,6 @@ $(document).ready(function() { ccn_messagebox_BindEvent(); // apply i18n + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); }); \ No newline at end of file diff --git a/src/static/js/page/login.js b/src/static/js/page/login.js index 6cab6e7..494898c 100644 --- a/src/static/js/page/login.js +++ b/src/static/js/page/login.js @@ -14,6 +14,7 @@ $(document).ready(function() { ccn_messagebox_BindEvent(); // apply i18n + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); // bind login event diff --git a/src/static/js/page/todo.js b/src/static/js/page/todo.js index f6ddd90..bc70b3b 100644 --- a/src/static/js/page/todo.js +++ b/src/static/js/page/todo.js @@ -16,6 +16,7 @@ $(document).ready(function() { ccn_messagebox_BindEvent(); // apply i18n + ccn_i18n_LoadLanguage(); ccn_i18n_ApplyLanguage(); // refresh once @@ -103,7 +104,7 @@ function ccn_todo_Add() { var result = ccn_api_todo_add(); if (typeof(result) == 'undefined') { // fail - ccn_messagebox_Show($.i18n.prop("ccn-js-fail-operate")); + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-add")); } else { // add into cache ccn_todo_todoListCache[result[0]] = result; @@ -147,9 +148,9 @@ function ccn_todo_ItemDelete() { ccn_todo_todoListCache[uuid][3] ); - if(typeof(result) == 'undefined') { + if(!result) { // fail - ccn_messagebox_Show($.i18n.prop("ccn-js-fail-operate")); + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-delete")); } else { // remove body $("#ccn-todo-todoItem-" + uuid).remove(); @@ -168,7 +169,7 @@ function ccn_todo_ItemUpdate() { if (typeof(result) == 'undefined') { // fail - ccn_messagebox_Show($.i18n.prop("ccn-js-fail-operate")); + ccn_messagebox_Show($.i18n.prop("ccn-js-fail-update")); } else { // safely update data & lastChanged and control ccn_todo_todoListCache[uuid][2] = newData; diff --git a/src/static/js/template.js b/src/static/js/template.js index 0fe55a8..9df0365 100644 --- a/src/static/js/template.js +++ b/src/static/js/template.js @@ -2,6 +2,9 @@ var ccn_template_headerNav = undefined; var ccn_template_messagebox = undefined; var ccn_template_calendarItem = undefined; var ccn_template_scheduleItem = undefined; +var ccn_template_sharingItem = undefined; +var ccn_template_sharingTargetItem = undefined; +var ccn_template_sharedItem = undefined; var ccn_template_userItem = undefined; var ccn_template_todoItem = undefined; @@ -43,6 +46,30 @@ function ccn_template_Load() { ccn_template_scheduleItem = $.templates(data); } }); + $.ajax({ + url: $("#jsrender-tmpl-sharingItem").attr('src'), + type: "GET", + async: false, + success: function (data) { + ccn_template_sharingItem = $.templates(data); + } + }); + $.ajax({ + url: $("#jsrender-tmpl-sharingTargetItem").attr('src'), + type: "GET", + async: false, + success: function (data) { + ccn_template_scheduleItem = $.templates(data); + } + }); + $.ajax({ + url: $("#jsrender-tmpl-sharedItem").attr('src'), + type: "GET", + async: false, + success: function (data) { + ccn_template_scheduleItem = $.templates(data); + } + }); break; case ccn_pages_enumPages.todo: $.ajax({ diff --git a/src/static/tmpl/sharedItem.tmpl b/src/static/tmpl/sharedItem.tmpl new file mode 100644 index 0000000..112f928 --- /dev/null +++ b/src/static/tmpl/sharedItem.tmpl @@ -0,0 +1,14 @@ +Shared by: Diablo
+this is a + namewwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww +
+boluo
+this is a name
-this is a name
-yyc12345
-boluo
-