diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml index 9a34dae..01c12f4 100644 --- a/grails-app/conf/application.yml +++ b/grails-app/conf/application.yml @@ -25,7 +25,7 @@ info: grailsVersion: '@info.app.grailsVersion@' server: contextPath: '/nibras' - port: 1440 # The port to listen on + port: 443 # The port to listen on ssl: enabled: true # Activate HTTPS mode on the server port key-store: keystore.jks # e.g. /etc/tomcat7/keystore/tomcat.keystore diff --git a/grails-app/controllers/app/IndicatorController.groovy b/grails-app/controllers/app/IndicatorController.groovy index 250f9dc..607b40b 100644 --- a/grails-app/controllers/app/IndicatorController.groovy +++ b/grails-app/controllers/app/IndicatorController.groovy @@ -9,9 +9,6 @@ package app import java.text.SimpleDateFormat -import jxl.* -import jxl.format.* -import jxl.write.* import grails.plugin.springsecurity.annotation.Secured @Secured('ROLE_ADMIN') diff --git a/grails-app/controllers/app/IndicatorDataController.groovy b/grails-app/controllers/app/IndicatorDataController.groovy index e6d4980..3c77859 100644 --- a/grails-app/controllers/app/IndicatorDataController.groovy +++ b/grails-app/controllers/app/IndicatorDataController.groovy @@ -9,9 +9,6 @@ package app import java.text.SimpleDateFormat -import jxl.* -import jxl.format.* -import jxl.write.* import grails.plugin.springsecurity.annotation.Secured @Secured('ROLE_ADMIN') diff --git a/grails-app/controllers/ker/GenericsController.groovy b/grails-app/controllers/ker/GenericsController.groovy index aaaecf5..aeabc68 100644 --- a/grails-app/controllers/ker/GenericsController.groovy +++ b/grails-app/controllers/ker/GenericsController.groovy @@ -43,7 +43,6 @@ import grails.converters.JSON import grails.plugin.springsecurity.annotation.Secured - @Secured('ROLE_ADMIN') class GenericsController { @@ -182,36 +181,34 @@ class GenericsController { if (!input.startsWith(' ')) { /** - def fullquery = queryHead + (queryCriteria ? ' where ' + queryCriteria : '') + def fullquery = queryHead + (queryCriteria ? ' where ' + queryCriteria : '') - queryKey = '_' + new Date().format('ddMMyyHHmmss') - session[queryKey] = fullquery + queryKey = '_' + new Date().format('ddMMyyHHmmss') + session[queryKey] = fullquery - params.max = Setting.findByNameLike('savedSearch.pagination.max.link') ? Setting.findByNameLike('savedSearch.pagination.max.link').value.toInteger() : 5 + params.max = Setting.findByNameLike('savedSearch.pagination.max.link') ? Setting.findByNameLike('savedSearch.pagination.max.link').value.toInteger() : 5 - input = '%' + input + '%' - "TGWNC".each() { entityCode -> - def count = Task.executeQuery('select count(*) from ' + entityMapping[entityCode] + ' where summary like ?', [input])[0] - def list = Task.executeQuery('from ' + entityMapping[entityCode] + ' where summary like ? order by lastUpdated desc', [input], params) + input = '%' + input + '%' + "TGWNC".each() { entityCode -> + def count = Task.executeQuery('select count(*) from ' + entityMapping[entityCode] + ' where summary like ?', [input])[0] + def list = Task.executeQuery('from ' + entityMapping[entityCode] + ' where summary like ? order by lastUpdated desc', [input], params) - render(template: '/gTemplates/recordListing', model: [ - totalHits: count, - list : list, - totalHits: count, - queryKey : queryKey, - title : entityCode + ': ' + count + ' results.' - ]) - } -*/ + render(template: '/gTemplates/recordListing', model: [ + totalHits: count, + list : list, + totalHits: count, + queryKey : queryKey, + title : entityCode + ': ' + count + ' results.' + ])}*/ findRecords('r -- ' + params.input) findRecords('c -- ' + params.input) findRecords('g -- ' + params.input) findRecords('t -- ' + params.input) findRecords('j -- ' + params.input) - findRecords('p -- ' + params.input) + findRecords('p -- ' + params.input) findRecords('w -- ' + params.input) @@ -226,7 +223,7 @@ class GenericsController { findRecords('g :: ' + params.input) findRecords('t :: ' + params.input) findRecords('j :: ' + params.input) - findRecords('p :: ' + params.input) + findRecords('p :: ' + params.input) findRecords('w :: ' + params.input) findRecords('n :: ' + params.input) @@ -240,7 +237,7 @@ class GenericsController { if (input == '?') render(template: '/page/help') - else if (input == 'col'){ + else if (input == 'col') { def colors = """AliceBlue;#F0F8FF AntiqueWhite;#FAEBD7 Aqua;#00FFFF @@ -476,7 +473,7 @@ YellowGreen;#9ACD32""" // print ' No add log file found' } f.text += block + '\n***\n\n' - */ + */ def prefixRecord = CommandPrefix.get(commandPrefix) def prefix = params.prefix ?: (prefixRecord.description ?: '') @@ -484,14 +481,14 @@ YellowGreen;#9ACD32""" if (prefixRecord.multiLine || !prefix) { block.eachLine() { if (it.trim() != '' && !it.startsWith('//')) - batchAdd(prefix + it) + batchAdd(prefix + it) } } else batchAdd(prefix + block.trim()) - - // block.split(/\*\*\*/).each() { region -> - // addWithDescription(region?.trim()) - // } + + // block.split(/\*\*\*/).each() { region -> + // addWithDescription(region?.trim()) + // } render '' } @@ -1246,6 +1243,9 @@ ll } else record.bookmarked = false +// operation/countResourceFiles/15544?entityCode=R + +// operation/copyToRps1/15544?entityCode=R record.save(flush: true) render(template: '/gTemplates/recordSummary', model: [record: record]) @@ -1411,24 +1411,187 @@ ll def id = params.id.split('-')[1].toLong() def record = grailsApplication.classLoader.loadClass(entityMapping[entityCode]).get(id) - if (!record.bookmarked) { - record.bookmarked = true + if (!record.bookmarked || record.bookmarked == false) { + if (record.class.declaredFields.name.contains('nbFiles')) { +// OperationController.countResourceFiles2(grailsApplication, entityCode, id) - if (entityCode == 'xE') { + def r + if (entityCode == 'R') + r = Book.findById(id) + else + r = grailsApplication.classLoader.loadClass(entityMapping[entityCode]).get(id) - supportService.pdfTitleUpdateNewPath(OperationController.getPath('module.sandbox.E.path'), record.id + 'e.pdf', - record.id + 'e_.pdf', - OperationController.getPath('onyx.path'), - record?.book?.course?.numberCode + ' ' + record?.book?.course?.code + ' ' + record.summary + ' ' + (record.book ? (' @ ' + record?.book?.title) : '')) - supportService.pdfTitleUpdateNewPath(OperationController.getPath('module.repository.E.path'), record.id + 'e.pdf', - record.id + 'e_.pdf', - OperationController.getPath('onyx.path'), - record?.book?.course?.numberCode + ' ' + record?.book?.course?.code + ' ' + record.summary + ' ' + (record.book ? (' @ ' + record?.book?.title) : '')) - } + def filesList + def message = '' + + if (r) { +//println ' b found' + filesList = [] + + def rps1Folder + def rps2Folder + if (entityCode == 'R') { + rps1Folder = + OperationController.getPath('root.rps1.path') + 'R/' + r.type?.code + '/' + (id / 100).toInteger() + '/' + id + rps2Folder = + OperationController.getPath('root.rps2.path') + '/R/' + r.type?.code + '/' + (id / 100).toInteger() + '/' + id +// println 'rps2 ' + rps2Folder + + } else { + rps1Folder = OperationController.getPath('root.rps1.path') + '/' + entityCode + '/' + id + rps2Folder = OperationController.getPath('root.rps2.path') + '/' + entityCode + '/' + id + } + + new File(rps1Folder).mkdirs() + if (new File(rps2Folder).exists()) { + new File(rps2Folder).eachFile() {//Match(~/[\S\s]*\.[\S\s]*/) { +// println ' file ' + it + if (it.isFile()) + filesList.add(it) + } + } + + + def ant = new AntBuilder() + + filesList.each() { f -> + ant.copy(file: f.path, tofile: rps1Folder + '/' + f.name) + } +// render filesList.size() + ' file(s) copied.' + + message = filesList.size() + ' file(s) copied.' + } else { + render 'Record not found.' + } + + if (entityCode == 'xE') { + + supportService.pdfTitleUpdateNewPath(OperationController.getPath('module.sandbox.E.path'), record.id + 'e.pdf', + record.id + 'e_.pdf', + OperationController.getPath('onyx.path'), + record?.book?.course?.numberCode + ' ' + record?.book?.course?.code + ' ' + record.summary + ' ' + (record.book ? (' @ ' + record?.book?.title) : '')) + supportService.pdfTitleUpdateNewPath(OperationController.getPath('module.repository.E.path'), record.id + 'e.pdf', + record.id + 'e_.pdf', + OperationController.getPath('onyx.path'), + record?.book?.course?.numberCode + ' ' + record?.book?.course?.code + ' ' + record.summary + ' ' + (record.book ? (' @ ' + record?.book?.title) : '')) + } + + + def typeSandboxPath + def typeLibraryPath + def typeRepositoryPath + + def filesCount + filesList = [] + def folders + + def list + + if (entityCode == 'R') { + + if (id) + list = [Book.get(id)] + else list = [Book.get(1)] //Todo + + for (b in list) { + filesCount = 0 + folders = [] + typeSandboxPath = OperationController.getPath('root.rps1.path') + '/R/' + b.type?.code +// typeLibraryPath = OperationController.getPath('root.rps3.path') + 'R/' + b.type?.code + //ResourceType.findByCode(type).libraryPath + typeRepositoryPath = OperationController.getPath('root.rps2.path') + '/R/' + b.type?.code + folders.add( + [typeSandboxPath + '/' + (b.id / 100).toInteger()]) + if (!b.bookmarked) + folders.add( + [typeRepositoryPath + '/' + (b.id / 100).toInteger()]) +// typeLibraryPath + '/' + (b.id / 100).toInteger() + // ] + folders.each() { folder -> +// println 'folder' + folder + if (new File(folder[0]).exists()) { + new File(folder[0]).eachFileMatch(~/${b.id}[a-z][\S\s]*\.[\S\s]*/) { + filesCount++ + filesList += it.name// + '\n' + } + } + } + folders = [] + folders.add( + [typeSandboxPath + '/' + (b.id / 100).toInteger() + '/' + b.id]) +// typeLibraryPath + '/' + (b.id / 100).toInteger() + '/' + b.id, + if (!b.bookmarked) + folders.add([typeRepositoryPath + '/' + (b.id / 100).toInteger() + '/' + b.id]) +// ] + + folders.each() { folder -> +// println 'fld ' + folder + ' class ' + folder.class + if (new File(folder[0]).exists()) { + new File(folder[0]).eachFile() { +//Match(~/[\S\s]*\.[\S\s]*/) { //ToDo: only files with extensions! + if (!it.isFile()) + filesList += '*** ' + it.name + else { + filesCount++ + filesList += it.name + } + } + } + } + //println filesCount + b.nbFiles = filesCount + b.filesList = filesList.join('\n') + + + } + } else { + + list = + [grailsApplication.classLoader.loadClass(entityMapping[entityCode]).get(id)] + + for (b in list) { + filesCount = 0 + folders = [] + typeSandboxPath = OperationController.getPath('root.rps1.path') + '/' + entityCode + '/' + + typeRepositoryPath = OperationController.getPath('root.rps2.path') + '/' + entityCode + '/' + folders.add([typeSandboxPath + '/' + (b.id)]) + if (!b.bookmarked) + folders.add([typeRepositoryPath + '/' + (b.id)]) + + + + folders.each() { folder -> + if (new File(folder[0]).exists()) { + new File(folder[0]).eachFile() { +//Match(~/[\S\s]*\.[\S\s]*/) { //ToDo: only files with extensions! + if (!it.isFile()) + filesList += '*** ' + it.name + else { + filesCount++ + filesList += it.name + } + } + } + } + //println filesCount + b.nbFiles = filesCount + b.filesList = filesList.join('\n') + } + } + render(template: '/layouts/achtung', model: [message: message + '...' + filesCount + ' files'])// + filesList.join('\n').replace('\n', '<br/>')]) +// render '<br/>' + filesCount + ' files: <br/>' + filesList.join('\n').replace('\n', '<br/>') + +// OperationController.copyToRps21(grailsApplication, entityCode, id) + + + } + record.bookmarked = true } else + record.bookmarked = false record.save(flush: true) @@ -1914,7 +2077,7 @@ ll def t = Tag.get(params.tagId) if (t) { instance.removeFromTags(t) - if(!t.occurrence) + if (!t.occurrence) t.occurrence = 0 else t.occurrence-- @@ -1938,8 +2101,8 @@ ll def t = Tag.findByName(params.tag?.trim()) if (t) { instance.addToTags(t) - if(!t.occurrence) - t.occurrence = 1 + if (!t.occurrence) + t.occurrence = 1 else t.occurrence++ render(template: '/tag/tags', model: [instance: instance, entity: params.entityCode]) } else if (params.tag != '') { @@ -2245,7 +2408,7 @@ ll // Planner.executeQuery("select count(*), t.course from Goal t group by t.course order by t.course.code asc").each() { // courses.add([id: it[1].id, value: it[1].toString() + ' (' + it[0] + ')']) // } -// +// // Planner.executeQuery("select count(*), t.department from Planner t group by t.department order by t.department.code asc").each() { // departments.add([id: it[1].id, value: it[1].toString() + ' (' + it[0] + ')']) // } @@ -2261,7 +2424,7 @@ ll // Planner.executeQuery("select count(*), t.course from Goal t group by t.course").each() { // courses.add([id: it[1].id, value: it[1].toString() + ' (' + it[0] + ')']) // } -// +// // Task.executeQuery("select count(*), t.department from Journal t group by t.department order by t.department.code asc").each() { // departments.add([id: it[1].id, value: it[1].toString() + ' (' + it[0] + ')']) // } @@ -2610,28 +2773,28 @@ ll break case 'type': - if (input.contains('from mcs.Goal')) { + if (input.contains('from Goal')) { groups = GoalType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Planner')) { + } else if (input.contains('from Planner')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from mcs.IndexCard')) { + } else if (input.contains('from Writing') || input.contains('from IndexCard')) { groups = WritingType.list([sort: 'name']) } break case 'status': - if (input.contains('from mcs.Goal')) { + if (input.contains('from Goal')) { groups = WorkStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from app.IndexCard')) { + } else if (input.contains('from Writing') || input.contains('from IndexCard')) { groups = WritingStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Book')) { + } else if (input.contains('from Book')) { groups = ResourceStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Goal') || input.contains('from mcs.Task') || input.contains('from mcs.Planner')) { + } else if (input.contains('from Goal') || input.contains('from Task') || input.contains('from Planner')) { groups = WorkStatus.list([sort: 'name']) } break @@ -2686,19 +2849,17 @@ ll s.queryType = 'hql' s.save(flush: true) render(template: '/gTemplates/recordSummary', model: [record: s]) - } - - else if (input.endsWith(' +')) { + } else if (input.endsWith(' +')) { try { - println new Date().format('HH:mm:ss') + //println new Date().format('HH:mm:ss') def entityCode = input.split(/[ ]+/)[0]?.toUpperCase() def queryHead = 'from ' + entityMapping[entityCode] def queryCriteria = transformMcsNotation(input.substring(0, input.length() - 2))['queryCriteria'] def fullquery = queryHead + (queryCriteria ? ' where ' + queryCriteria : '') - println 'fq ' + fullquery - def list = Task.executeQuery(fullquery + ' order by lastUpdated desc',[], params) + // println 'fq ' + fullquery + def list = Task.executeQuery(fullquery + ' order by lastUpdated desc', [], params) def r def limit = ker.OperationController.getPath('updateResultSet.max-items')?.toInteger() ?: 100 if (list.size() < limit) { @@ -2716,7 +2877,7 @@ ll def queryKey = '_' + new Date().format('ddMMyyHHmmss') session[queryKey] = fullquery - println '-> ' + Task.executeQuery(fullquerySort)[0] +// println '-> ' + Task.executeQuery(fullquerySort)[0] params.max = Setting.findByNameLike('savedSearch.pagination.max.link') ? Setting.findByNameLike('savedSearch.pagination.max.link').value.toInteger() : 5 render(template: '/gTemplates/recordListing', model: [ totalHits: Task.executeQuery(fullquerySort)[0].toLong(), //.size(), @@ -2728,7 +2889,7 @@ ll } else { render 'Result set size is greater than ' + limit + '. Please narrow your search' } - } catch(Exception e){ + } catch (Exception e) { println e.printStackTrace() } @@ -2738,6 +2899,8 @@ ll def groupBy = input.split(/ \{/)[1] + def entityCode = input.split(/[ ]+/)[0]?.toUpperCase() + def groups switch (groupBy) { @@ -2752,29 +2915,29 @@ ll break case 'type': - if (input.contains('from mcs.Goal')) { + if (entityCode == 'G') { groups = GoalType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (entityCode == 'J') { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Planner')) { + } else if (entityCode == 'P') { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (entityCode == 'P') { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from app.IndexCard')) { + } else if (entityCode == 'W' || entityCode == 'N') { groups = WritingType.list([sort: 'name']) } break case 'status': - if (input.contains('from mcs.Goal')) { + //if (input.contains('from mcs.Goal')) { + + if ("TPG".contains(entityCode)) { groups = WorkStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (entityCode == 'J') { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from app.IndexCard')) { + } else if (entityCode == 'W' || entityCode == 'N') { groups = WritingStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Book')) { + } else if (entityCode == 'R') { groups = ResourceStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Goal') || input.contains('from mcs.Task') || input.contains('from mcs.Planner')) { - groups = WorkStatus.list([sort: 'name']) } break case 'location': @@ -2791,7 +2954,6 @@ ll groups = [1, 2, 3, 4, 5] break } - def entityCode = input.split(/[ ]+/)[0]?.toUpperCase() // input = params.input.substring(params.input.indexOf(' ')) @@ -2814,8 +2976,7 @@ ll fullquery = session[input] fullquerySort = 'select count(*) ' + fullquery queryKey = input - } - else { + } else { def entityCode = input.split(/[ ]+/)[0]?.toUpperCase() // input = params.input.substring(params.input.indexOf(' ')) @@ -2878,28 +3039,28 @@ ll break case 'type': - if (input.contains('from mcs.Goal')) { + if (input.contains('from Goal')) { groups = GoalType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Planner')) { + } else if (input.contains('from Planner')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from app.IndexCard')) { + } else if (input.contains('from Writing') || input.contains('from IndexCard')) { groups = WritingType.list([sort: 'name']) } break case 'status': - if (input.contains('from mcs.Goal')) { + if (input.contains('from Goal')) { groups = WorkStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('from Journal')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from app.IndexCard')) { + } else if (input.contains('from Writing') || input.contains('from app.IndexCard')) { groups = WritingStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Book')) { + } else if (input.contains('from Book')) { groups = ResourceStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Goal') || input.contains('from mcs.Task') || input.contains('from mcs.Planner')) { + } else if (input.contains('from Goal') || input.contains('from Task') || input.contains('from Planner')) { groups = WorkStatus.list([sort: 'name']) } break @@ -3086,7 +3247,7 @@ ll } catch (Exception e) { // render 'Exception in quick add' + e - print 'Exception in quick add' + e.printStackTrace() + println 'Exception in quick add: ' + e.printStackTrace() } } @@ -3159,7 +3320,7 @@ ll if (!n.hasErrors() && n.save()) { // render('Saved with id ' + n.id) - render(template: '/layouts/achtung', model: [message: 'Payment [' + n.summary + '] saved with id ' + n.id+ '.']) + render(template: '/layouts/achtung', model: [message: 'Payment [' + n.summary + '] saved with id ' + n.id + '.']) } else { render('Problem saving.') // n.errors.each() { @@ -4011,12 +4172,16 @@ ll core.matches(/^\d\d\d[\_][0-9]{1,4}$/) || core.matches(/^\d\d\d[\_][0-9]{1,4}[\.][0-9]{2}$/)) { properties[dateField] = OperationController.fromWeekDateAsDateTimeFullSyntax(core) + queryCriteria.add("date(" + dateField + ') = str_to_date("' + OperationController.fromWeekDateAsDateTimeFullSyntax(core).format('dd.MM.yyyy') + '", "%d.%m.%Y")') + // todo: test } else if (core.contains('_')) { def format = Setting.findByName('datetime.add.format') - properties[dateField] = Date.parse(format ? format.value : 'dd.MM.yyyy_HHmm', core) + properties[dateField] = Date.parse(format ? format.value : 'dd.MM.YYYY_HHmm', core) + queryCriteria.add("date(" + dateField + ") = " + Date.parse(format ? format.value : 'dd.MM.YYYY_HHMM', core)?.format('YYYY-MM-DD')) } else { def format = Setting.findByName('date.format') properties[dateField] = Date.parse(format ? format.value : 'dd.MM.yyyy', core) + queryCriteria.add("date(" + dateField + ") = str_to_date('" + Date.parse(format ? format.value : 'dd.MM.yyyy', core).format('dd.MM.YYYY') + "', '%d.%m.%Y')") } } } @@ -4032,9 +4197,15 @@ ll core.matches(/^\d\d\d[\_][0-9]{1,4}$/) || core.matches(/^\d\d\d[\_][0-9]{1,4}[\.][0-9]{2}$/)) { properties[dateField] = OperationController.fromWeekDateAsDateTimeFullSyntax(core) + queryCriteria.add("date(" + dateField + ') = str_to_date("' + OperationController.fromWeekDateAsDateTimeFullSyntax(core).format('dd.MM.yyyy') + '", "%d.%m.%Y")') + } else if (core.contains('_')) { + def format = Setting.findByName('datetime.add.format') + properties[dateField] = Date.parse(format ? format.value : 'dd.MM.YYYY_HHmm', core) + queryCriteria.add("date(" + dateField + ") = " + Date.parse(format ? format.value : 'dd.MM.YYYY_HHMM', core)?.format('YYYY-MM-DD')) } else { def format = Setting.findByName('date.format') properties[dateField] = Date.parse(format ? format.value : 'dd.MM.yyyy', core) + queryCriteria.add("date(" + dateField + ') = str_to_date("' + OperationController.fromWeekDateAsDateTimeFullSyntax(core).format('dd.MM.yyyy') + '", "%d.%m.%Y")') } } } @@ -4146,6 +4317,7 @@ ll result['queryCriteria'] = queryCriteria.join(' and ') result['properties'] = properties + // println result['queryCriteria'] return result } @@ -4521,30 +4693,30 @@ def addTagToAll(String input) { groups = Course.list([sort: 'summary']) break case 'type': - if (input.contains('from mcs.Goal')) { + if (input.contains('Goal ')) { groups = GoalType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('Journal ')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Planner')) { + } else if (input.contains('Planner ')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('Journal ')) { groups = PlannerType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing') || input.contains('from mcs.IndexCard')) { + } else if (input.contains('Writing ') || input.contains('IndexCard ')) { groups = WritingType.list([sort: 'name']) } break case 'status': - if (input.contains('from mcs.Goal')) { + if (input.contains('Goal ')) { groups = WorkStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Journal')) { + } else if (input.contains('Journal ')) { groups = JournalType.list([sort: 'name']) - } else if (input.contains('from mcs.Writing')) { + } else if (input.contains('Writing ')) { groups = WritingStatus.list([sort: 'name']) - } else if (input.contains('from app.IndexCard')) { + } else if (input.contains('IndexCard ')) { groups = WritingStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Book')) { + } else if (input.contains('Book ')) { groups = ResourceStatus.list([sort: 'name']) - } else if (input.contains('from mcs.Goal') || input.contains('from mcs.Task') || input.contains('from mcs.Planner')) { + } else if (input.contains('Goal ') || input.contains('Task ') || input.contains('Planner ')) { groups = WorkStatus.list([sort: 'name']) } break @@ -4664,16 +4836,16 @@ def addTagToAll(String input) { record.save(flush: true) render(record.description.replace('\n', '<br/>')) } - if (record.notes) { + if (record.notes) { record.notes = record.notes?.replace(' وَ ', ' وَ')?.replaceAll(/\nوَ /, ' وَ') .replaceAll(/\nوَ /, ' وَ') - .replaceAll(/^و /, 'و' ) - .replaceAll(/\nو / , '\nو' ) + .replaceAll(/^و /, 'و') + .replaceAll(/\nو /, '\nو') .replace(/^وَ /, '\n وَ').replace(' و ', ' و').replace('ی', 'ي').replace('ک', 'ك') record.save(flush: true) render(record.notes.replace('\n', '<br/>')) } - if (record.class.declaredFields.name.contains('fullText') && record.fullText){ + if (record.class.declaredFields.name.contains('fullText') && record.fullText) { record.fullText = record.fullText?.replace(' وَ ', ' وَ')?.replaceAll(/\nوَ /, ' وَ') .replaceAll(/\nوَ /, ' وَ') .replaceAll(/^و /, ' و') diff --git a/grails-app/controllers/ker/PageController.groovy b/grails-app/controllers/ker/PageController.groovy index 469a728..4e0fafd 100644 --- a/grails-app/controllers/ker/PageController.groovy +++ b/grails-app/controllers/ker/PageController.groovy @@ -276,9 +276,30 @@ class PageController { // println 'r ' + resources // println 'e ' + excerpts + def ips = [] + def ip + def interf + + def interfaces = NetworkInterface.getNetworkInterfaces() + + while (interfaces.hasMoreElements()) { + + interf = interfaces.nextElement() + def addresses = interf.getInetAddresses() + + while (addresses.hasMoreElements()) { + ip = addresses.nextElement().getHostAddress().toString() + if (ip && ip != '' && !ip.contains(':') && !ip.startsWith('127')) + ips.add([name: interf.getName(), title: interf.getDisplayName(), ip: ip]) +// println (addresses.nextElement().getCanonicalHostName()) +// println (addresses.nextElement().hostAddress) + } + } + render(view: '/appMain/main', model: [ htmlContent: null, + ips: ips, selectBasketCount: GenericsController.selectedRecords.size(), editFileCount: c, reviewPileSize: resources.size() + excerpts.size() @@ -300,6 +321,12 @@ class PageController { ]) } + def appKanban() { + + render(view: '/appKanban/main', model: []) + + } + def appDaftar(){ render(view: '/appMain/daftar', model: []) } @@ -414,7 +441,7 @@ class PageController { } def kanban() { - render(view: '/page/kanban', model: []) + render(view: '/page/kanbanCrs', model: []) } def kanbanCrs() { diff --git a/grails-app/controllers/ker/SyncController.groovy b/grails-app/controllers/ker/SyncController.groovy index 110e648..ea23e15 100644 --- a/grails-app/controllers/ker/SyncController.groovy +++ b/grails-app/controllers/ker/SyncController.groovy @@ -353,7 +353,8 @@ class SyncController { def records = [] def priorityMap = [5: 'p5', 4: 'p4', 3: 'p3', 2: 'p2', 1: 'p1'] - for (i in IndexCard.executeQuery("from Book where type.code != ? and type.code != ? and bookmarked = ? and lastUpdated > ? order by department.orderNumber asc, course.orderNumber asc, orderNumber asc", ['art', 'nws', true, new Date() - 7])) { + for (i in IndexCard.executeQuery("from Book where type.code != ? and type.code != ? and bookmarked = ? order by department.orderNumber asc, course.orderNumber asc, orderNumber asc", + ['art', 'nws', true])) { // OperationController.countResourceFiles(i.id) records += [type : 'R', id: i.id, rtype : i?.type?.code, ecode: 'R', diff --git a/grails-app/controllers/mcs/TaskController.groovy b/grails-app/controllers/mcs/TaskController.groovy index c389c38..c42321c 100644 --- a/grails-app/controllers/mcs/TaskController.groovy +++ b/grails-app/controllers/mcs/TaskController.groovy @@ -362,6 +362,7 @@ class TaskController { // entity id = 127 def level = params.level def date = params.date//.substring(0,3).toString() + def endDate = params.endDate//.substring(0,3).toString() def stime def etime // if (params.date.length() > 3){ @@ -377,8 +378,8 @@ class TaskController { // entity id = 127 def startDate = OperationController.fromWeekDateAsDateTimeFullSyntax(date) //Date.parse('dd.MM.yyyy HH:mm', supportService.fromWeekDate(date) + stime) - def endDate = startDate - + def endDate = OperationController.fromWeekDateAsDateTimeFullSyntax(endDate) + /** switch (level) { case 'i': endDate = startDate @@ -403,6 +404,7 @@ class TaskController { // entity id = 127 break } + */ //Date.parse('dd.MM.yyyy HH:mm', supportService.fromWeekDate(date) + etime) diff --git a/grails-app/views/appCalendar/main.gsp b/grails-app/views/appCalendar/main.gsp index b6e988f..97f9e2f 100644 --- a/grails-app/views/appCalendar/main.gsp +++ b/grails-app/views/appCalendar/main.gsp @@ -88,7 +88,7 @@ // columnHead: false }, - defaultView: 'dayGridWeek', + defaultView: 'dayGridMonth', allDaySlot: true, nowIndicator: true, timeGridEventMinHeight: true, diff --git a/grails-app/views/appKanban/_east.gsp b/grails-app/views/appKanban/_east.gsp new file mode 100644 index 0000000..62c321b --- /dev/null +++ b/grails-app/views/appKanban/_east.gsp @@ -0,0 +1,18 @@ +<%@ page import="mcs.parameters.ResourceStatus; mcs.Goal; org.apache.commons.lang.StringUtils; mcs.Book; app.parameters.ResourceType; mcs.Writing; mcs.Department; mcs.parameters.WritingType; app.Tag; cmn.Setting; mcs.Course; mcs.Journal; mcs.Planner; app.IndexCard; mcs.Task; ker.OperationController" %> + +<div id="accordionEast" class="basic"> + + <h3><a href="#"> + <g:message code="ui.details"></g:message> + + </a></h3> + + <div id="3rdPanel"> + + </div> + + + + + + </div> \ No newline at end of file diff --git a/grails-app/views/appKanban/_north.gsp b/grails-app/views/appKanban/_north.gsp new file mode 100644 index 0000000..5392b85 --- /dev/null +++ b/grails-app/views/appKanban/_north.gsp @@ -0,0 +1,160 @@ +<%@ page import="ker.OperationController; java.text.DecimalFormat; cmn.Setting; grails.util.Metadata" %> + +<table id="rssList" border="0" dir="ltr" cellspacing="2px" style="line-height: 15px;text-align: left; width: 95%"> + <tr> + %{--<td>--}% + %{-- <img src="${resource(dir: 'images', file: 'favicon-transparent.png')}" width="16px;"/>--}% + %{-- --}% + %{--</td>--}% + <td style="padding-right: 1px !important;"> + + + <g:remoteLink controller="report" action="homepageSavedSearches" + + update="centralArea" title="Homepage saved searches"> + %{--<span class="ui-icon ui-icon-calendar"></span>--}% + + + + <span style="margin-right: 1px;"> + <b style="font-size: 12px; font-family: tahoma, sans-serif;"> + ${OperationController.getPath('app.name') ?: 'Nibras'} /Kanban</b> + </span> + </g:remoteLink> + + </td> + + %{--<g:link controller="page" action="main"--}% + %{--title="">--}% + + %{--<g:meta name="app.version"/>--}% + %{--todo--}% + %{--</g:link>--}% + %{--<g:if test="${OperationController.getPath('show.textlogo')?.toLowerCase() == 'yes' ? true : false}">--}% + %{--<sub>--}% + %{--<a href="http://pomegranate-pkm.org" target="_blank">--}% + %{--<i style="font-size: 10px; color: #ffffff">A Pomegranate PKM system</i>--}% + %{--</a>--}% + %{--</sub>--}% + %{--</g:if>--}% + <td style="padding-right: 5px !important;"> + %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% + <% Calendar c = new GregorianCalendar(); c.setLenient(false); c.setMinimalDaysInFirstWeek(4); + c.setFirstDayOfWeek(java.util.Calendar.MONDAY) %> + <b style="color: white"> +%{-- Week ${c.get(Calendar.WEEK_OF_YEAR)}--}% + </b> + </td> + %{--</sec:ifAnyGranted>--}% + + + + + + %{--<g:remoteLink controller="report" action="detailedAdd"--}% + %{--update="centralArea"--}% + %{--before="jQuery.address.value(jQuery(this).attr('href'));"--}% + %{--style=""--}% + %{--title="Add using forms">--}% + %{--<g:message code="ui.addRecords"></g:message>--}% + %{--</g:remoteLink>--}% + + <td style="padding: 1px !important; margin-left: 9px; color: white;"> + + <g:formRemote name="batchAdd3" + url="[controller: 'generics', action: 'quickQuranSearch']" + update="centralArea" style="display: inline" + before="jQuery('#testTitle5').text('[3]: ' + jQuery('#testField5').val());" + method="post"> + + %{--<g:hiddenField name="sth2" value="${new java.util.Date()}"/>--}% + <g:submitButton name="batch" value="Execute" + style="margin: 0px; display: none" + id=" " + class="ui-widget ui-state-default"/> + + <g:textField name="input" value="" id="speedsearch" + autocomplete="off" + style="float: right; display: inline; width: 220px !important; height: 24px; padding: 2px; margin: 1px; font-size: 11px;" + placeholder="Search..." + class=""/> + + </g:formRemote> + + </td> + + %{--<td style="padding: 1px !important; margin-left: 9px; color: white;">--}% + + %{--<a href="/nibras/sync/rssPile"--}% + %{--class="fg-button-icon-left"--}% + %{--style="" target="_blank">--}% + %{--<span style="color: white" class="ui-icon ui-icon-signal"></span>--}% + %{--<g:message code="ui.menu.RSS"></g:message>--}% + %{--</a>--}% + %{--</td>--}% + + <td style="padding: 1px !important; margin-left: 9px; color: white;"> + + <a href="http://khuta.org/nibras-doc/index.html" + style="" target="_blank"> +%{-- <span style="color: white" class="ui-icon ui-icon-help"></span>--}% + <g:message code="ui.menu.help"></g:message> + </a> + </td> + %{--<td>--}% + %{--بالصفحة--}% + + %{--</td>--}% + + %{--<li>--}% + %{----}% + %{--نسخه <i>--}% + %{----}% + %{--</i><g:meta name="app.version"/>--}% + %{--</li>--}% + + </tr> +</table> + + + + +%{--<div id="dialog" title="Basic dialog">--}% +%{--<p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>--}% +%{--</div>--}% + +<script> + // $("#dialog").dialog(); + + function dualDisplay() { + document.getElementById("centralArea").id = "temp1q"; + document.getElementById("sandboxPanel").id = "centralArea"; + console.log('dual') + jQuery('#accordionEast').accordion({active: 3}); + + } + + function singleDisplay() { + document.getElementById("temp1q").id = "centralArea"; + document.getElementById("centralArea").id = "sandboxPanel"; + console.log('single') + } + + + $('#selectAll').click(function (e) { + $("input[name^='select-']").each(function () { +// this['value'] = 'on' + this['checked'] = true +// console.log(this.attr('value')); + jQuery('#logRegion').load('/nibras/generics/selectOnly/' + this['name'].split('-')[2] + this['name'].split('-')[1]); + }); + }) + + $('#deselectAll').click(function (e) { + $("input[name^='select-']").each(function () { + this['checked'] = false +// console.log(this.attr('value')); + jQuery('#logRegion').load('/nibras/generics/deselectOnly/' + this['name'].split('-')[2] + this['name'].split('-')[1]); + }); + }) +</script> \ No newline at end of file diff --git a/grails-app/views/appKanban/_regions.gsp b/grails-app/views/appKanban/_regions.gsp new file mode 100644 index 0000000..7accc5f --- /dev/null +++ b/grails-app/views/appKanban/_regions.gsp @@ -0,0 +1,339 @@ +<%@ page import="mcs.parameters.ResourceStatus; mcs.Goal; org.apache.commons.lang.StringUtils; mcs.Book; app.parameters.ResourceType; mcs.Writing; mcs.Department; mcs.parameters.WritingType; app.Tag; cmn.Setting; mcs.Course; mcs.Journal; mcs.Planner; app.IndexCard; mcs.Task; ker.OperationController" %> +%{--${ker.OperationController.getPath('app.headers.background') ?: '#5b7a59'}--}% +<div class="ui-layout-north southRegion appBkg" style="overflow: hidden;" + style=""> + %{--<g:render template="/layouts/north" model="[]"/>--}% + <g:render template="/appKanban/north"/> +</div> + +%{--<div class="ui-layout-west westRegion appBkg" style="padding-top: 0px !important;padding-bottom: 0px !important;">--}% + +%{--<div class="ui-layout-content ui-widget-content">--}% + +%{--<g:render template="/appKanban/west"/>--}% +%{--</div>--}% + +<div class="ui-layout-south footerRegion" + style="font-size: 11px; margin-top: 9px; min-height: 0px !important; padding: 3px; direction: ltr; text-align: left; font-family: tahoma; color: white"> + + <g:render template="/appMain/south"/> +</div> + + +<div class="ui-layout-east eastRegion appBkg" style="padding-top: 0px !important;padding-bottom: 0px !important;"> + + %{--<div class="ui-layout-content ui-widget-content">--}% + + <g:render template="/appKanban/east"/> +</div> + + +<div class="ui-layout-center appBkg" + style="margin-top: 2px !important; margin-bottom: 2px !important; background: white; overflow-y: scroll; width: 96% !important;" + onmouseover="jQuery('#hintArea').html('')"> + %{--ToDo: display none?!--}% + %{--<div class="ui-layout-content ui-widget-content" onmouseover="jQuery('#hintArea').html('')">--}% + + + <div id="logRegion"></div> + + <div id="logArea"></div> + + + <div id="searchArea" class="nonPrintable"> + + </div> + + <div id="spinner2" style="display:none; z-index: 10000 !important"> + <img src="${resource(dir: '/images', file: 'pmg-grain.gif')}" alt="Spinner2" + style="z-index: 10000 !important"/> + </div> + %{--<sec:ifNotGranted roles="ROLE_ADMIN">--}% + %{--<g:if test="${OperationController.getPath('commandBar.enabled')?.toLowerCase() == 'yes' ? true : false}">--}% + %{--<g:render template="/layouts/commandbar" model="[]"/>--}% + %{--</g:if>--}% + %{--</sec:ifNotGranted>--}% + + <div id="inner1" class="common" style=""> + + <div id="centralArea" class="common kanbanTables"> + + <h3>T / context</h3> + <table border="1" style="margin: 10px; width: 98%; border: #496779; border-collapse: collapse;"> + + <thead> + + <g:each in="${mcs.Task.executeQuery('select t.context from Task t where t.bookmarked = 1 group by t.context order by t.context.code')}" + var="d"> + <th>@<b>${d.code}</b></th> + + </g:each> + + </thead> + + + <tr> + + <g:each in="${mcs.Task.executeQuery('select t.context from Task t where t.bookmarked = 1 group by t.context order by t.context.code')}" + var="d"> + <td id="kanban"> + + <g:each in="${mcs.Book.executeQuery('from Task p where p.bookmarked = 1 and p.context = ? order by orderInCourse asc', + [d])}" + var="p"> + <g:render template="/gTemplates/box" model="[record: p]"></g:render> + </g:each> + + </td> + + </g:each> + + </tr> + + </table> + + <h3>R G C / dept</h3> + + <table border="1" style="margin: 10px; width: 98%; border: #496779; border-collapse: collapse;"> + + <thead> + <th></th> + <g:each in="${mcs.Department.findAllByBookmarked(true, [sort: 'code'])}" var="d"> + <th>d<b> ${d.code}</b></th> + + </g:each> + + </thead> + + + <tr> + <td>R*</td> + <g:each in="${mcs.Department.findAllByBookmarked(true, [sort: 'code'])}" var="d"> + <td style="background: #d4edda"> + <g:each in="${mcs.Book.executeQuery('from Book p where p.bookmarked = 1 and p.type.code = ? and p.course.department = ? order by orderInCourse asc', + ["ebk", d])}" + var="p"> + <g:render template="/gTemplates/box" model="[record: p]"></g:render> + </g:each> + </td> + </g:each> + </tr> + <tr> + <td>G*</td> + <g:each in="${mcs.Department.findAllByBookmarked(true, [sort: 'code'])}" var="d"> + <td style="background: #fff3cd"> + <g:each in="${mcs.Book.executeQuery('from Goal p where p.bookmarked = 1 and p.department = ? order by orderInCourse asc', + [d])}" + var="p"> + <g:render template="/gTemplates/box" model="[record: p]"></g:render> + </g:each> + </td> + </g:each> + </tr> + <tr> + <td>C*</td> + <g:each in="${mcs.Department.findAllByBookmarked(true, [sort: 'code'])}" var="d"> + <td style="background: #d3e0d3"> + <g:each in="${mcs.Book.executeQuery('from Course p where p.bookmarked = 1 and p.department = ? and p.priority = 4 order by orderNumber asc', + [d])}" + var="p"> + + <g:render template="/gTemplates/box" model="[record: p]"></g:render> + </g:each> + + </td> + </g:each> + + </tr> + + </table> + + + %{--<span class="focusPSouth" style="text-align: right !important; direction: rtl !important;"--}% + %{--title="${Planner.executeQuery('from Planner p where p.type.code = ? order by id desc', ['knb'])[0]?.description}">--}% + %{--<h5>Last plan</h5>--}% + %{--<g:render template="/gTemplates/recordSummary" model="[record: Planner.executeQuery('from Planner p where p.type.code = ? order by id desc', [OperationController.getPath('planner.homepage.default-type')],[max: 1])[0]]"></g:render>--}% + + %{--</span>--}% + + %{--<g:if test="${!new File(OperationController.getPath('root.rps1.path')).exists()}">--}% + %{--<br/>--}% + %{--<br/>--}% + %{--Repository folder not found. Please choose an existing folder:--}% + %{--<br/>--}% + %{--<g:render template="/forms/updateSetting" model="[settingValue: 'root.rps1.path']"/>--}% + %{--</g:if>--}% + + + %{--<g:if test="${ker.GenericsController.countRecentRecordsStatic() == 0}">--}% + %{--<g:render template="/layouts/message" model="[messageCode: 'help.recent.records.no']"/>--}% + %{--</g:if>--}% + </div> + +</div> + + + + +%{--<br/>--}% + +%{--first commented one below was in action 14.03.2019 --}% +%{--<g:formRemote name="batchAdd2" class="commandBarInPanel"--}% +%{--url="[controller: 'generics', action: 'actionDispatcher']"--}% +%{--update="centralArea" style="display: inline"--}% +%{--before="jQuery('#testTitle4').text('[4]: ' + jQuery('#testField4').val());"--}% +%{--method="post">--}% +%{--<g:hiddenField name="sth2" value="${new java.util.Date()}"/>--}% +%{--<g:submitButton name="batch" value="Execute"--}% +%{--style="height: 30px; margin: 0px; width: 100px !important; display: none"--}% +%{--id="quickAddXcdSubmitTop5"--}% +%{--class="fg-button ui-widget ui-state-default"/>--}% + +%{--<g:textField name="input" value="" id="testField4"--}% +%{--autocomplete="off"--}% +%{--style="display: inline; font-family: tahoma ; width: 100% !important;"--}% +%{--placeholder=""--}% +%{--class="commandBarTexFieldTop"/>--}% +%{--</g:formRemote>--}% + + + + +%{--<g:formRemote name="batchAdd2"--}% +%{--url="[controller: 'generics', action: 'actionDispatcher']"--}% +%{--update="centralArea" style="display: inline"--}% +%{--method="post">--}% +%{--<g:hiddenField name="sth2" value="${new java.util.Date()}"/>--}% +%{--<g:submitButton name="batch" value="Execute"--}% +%{--style="height: 20px; margin: 0px; width: 100px !important; display: none"--}% +%{--id="quickAddXcdSubmitTop6"--}% +%{--class="fg-button ui-widget ui-state-default"/>--}% + +%{--<g:textField name="input" value=""--}% +%{--autocomplete="off"--}% +%{--style="display: inline; font-family: tahoma ; width: 100% !important;"--}% +%{--placeholder=""--}% +%{--class="commandBarTexFieldTop"/>--}% +%{--</g:formRemote>--}% + +%{--<g:formRemote name="batchAdd2"--}% +%{--url="[controller: 'generics', action: 'actionDispatcher']"--}% +%{--update="centralArea" style="display: inline"--}% +%{--method="post">--}% +%{--<g:hiddenField name="sth2" value="${new java.util.Date()}"/>--}% +%{--<g:submitButton name="batch" value="Execute"--}% +%{--style="height: 20px; margin: 0px; width: 100px !important; display: none"--}% +%{--id="quickAddXcdSubmitTop7"--}% +%{--class="fg-button ui-widget ui-state-default"/>--}% + +%{--<g:textField name="input" value=""--}% +%{--autocomplete="off"--}% +%{--style="display: inline; font-family: tahoma ; width: 100% !important;"--}% +%{--placeholder=""--}% +%{--class="commandBarTexFieldTop"/>--}% +%{--</g:formRemote>--}% + + +%{--<h6 style="text-aling: center"><a href="#" id="testTitle5">--}% +%{--5--}% +%{--</a></h6>--}% + +%{--<div id=5 class="common" style="">--}% +%{--<div id="inner5" class="common" style="">--}% +%{--</div>--}% + +%{--<g:formRemote name="batchAdd5" class="commandBarInPanel"--}% +%{--url="[controller: 'generics', action: 'actionDispatcher']"--}% +%{--update="centralArea" style="display: inline"--}% +%{--before="jQuery('#testTitle5').text('[5]: ' + jQuery('#testField5').val());"--}% +%{--method="post">--}% +%{--<g:hiddenField name="sth5" value="${new java.util.Date()}"/>--}% +%{--<g:submitButton name="batch" value="Execute"--}% +%{--style="height: 30px; margin: 0px; width: 100px !important; display: none"--}% + +%{--id="quickAddXcdSubmitTop8"--}% +%{--class="fg-button ui-widget ui-state-default"/>--}% + +%{--<g:textField name="input" value=""--}% +%{--autocomplete="off"--}% +%{--id="testField5"--}% +%{--style="display: inline; font-family: tahoma ; width: 100% !important;"--}% +%{--placeholder=""--}% +%{--class="commandBarTexFieldTop"/>--}% +%{--</g:formRemote>--}% + +%{--</div>--}% + +</div> +%{--<hr/>--}% +%{--before="jQuery('#testTitle1').text('[1]: ' + jQuery('#quickAddTextFieldBottomTop').val());"--}% +%{--if (jQuery('#quickAddTextFieldBottomTop').val().search('--')== -1){--}% +%{--<div style="-moz-column-count: 3; -webkit-column-count:3">--}% +<div id="hintArea" style="font-size: 12px; padding: 0px; margin: 0px; "></div> +%{--</div>--}% + +</div> +<script type="text/javascript"> + jQuery(".chosen").chosen({allow_single_deselect: true, no_results_text: "None found"}); + jQuery("#chosenTags").chosen({allow_single_deselect: true, no_results_text: "None found"}); + jQuery("#chosenTagsArt").chosen({allow_single_deselect: true, no_results_text: "None found"}); + + // jQuery("#addXcdFormNgs").relatedSelects({ + // onChangeLoad: '/nibras/generics/fetchCoursesForDepartment', + // defaultOptionText: '', + // selects: { + // 'department.id': {loadingMessage: ''}, + // 'course.id': {loadingMessage: ''} + // } + // }); + + jQuery("#addArticleFormNgs").relatedSelects({ + onChangeLoad: '/nibras/generics/fetchCoursesForDepartment', + defaultOptionText: '', + selects: { + 'department.id': {loadingMessage: ''}, + 'course.id': {loadingMessage: ''} + } + }); + jQuery("#addXcdFormNgs").relatedSelects({ + onChangeLoad: '/nibras/generics/fetchWritingsForCourse', + defaultOptionText: '', + selects: { + 'course.id': {loadingMessage: ''}, + 'writing.id': {loadingMessage: ''} + } + }); + + jQuery('#chosenTags_chzn').addClass('width95') + jQuery('#chosenTagsArt_chzn').addClass('width95') + + + var clearFormFields = function () { + + jQuery('#title').val('') + jQuery('#summary').val('') + jQuery('#description').val('') + jQuery('#fullText').val('') + jQuery('#link').val('') + jQuery('#url').val('') + jQuery('#approximateDate').clear() + } + + + $(".common").prev('h6').click(function () { + document.getElementById("centralArea").setAttribute("id", "tmpId"); + //$(this).id//.nextSibling().setAttribute("id", "centralArea"); +// console.log(document.getElementById($(this).next().attr("id")).attr("id")) + //$(this).next()[0].firstChild.setAttribute("id", "centralArea"); + $(this).next()[0].firstChild.nextSibling.setAttribute("id", "centralArea"); + //console.log($(this).next().attr('id')); + + + //alert(currentID); + +// $(this).next().setAttribute("id", "centralArea"); + + }); + + +</script> \ No newline at end of file diff --git a/grails-app/views/appKanban/_west.gsp b/grails-app/views/appKanban/_west.gsp new file mode 100644 index 0000000..7c5e70a --- /dev/null +++ b/grails-app/views/appKanban/_west.gsp @@ -0,0 +1,19 @@ +<%@ page import="mcs.parameters.ResourceStatus; mcs.Goal; org.apache.commons.lang.StringUtils; mcs.Book; app.parameters.ResourceType; mcs.Writing; mcs.Department; mcs.parameters.WritingType; app.Tag; cmn.Setting; mcs.Course; mcs.Journal; mcs.Planner; app.IndexCard; mcs.Task; ker.OperationController" %> +<div id="accordionWest" class="basic"> + + + <h3 style="text-align: right;"><a href="#" > +%{-- <g:message code="ui.Quran"></g:message>--}% + + </a></h3> + + <div> + + + + + + </div> + + +</div> \ No newline at end of file diff --git a/grails-app/views/appKanban/main.gsp b/grails-app/views/appKanban/main.gsp new file mode 100644 index 0000000..b1268de --- /dev/null +++ b/grails-app/views/appKanban/main.gsp @@ -0,0 +1,483 @@ +%{-- + - Copyright (c) 2018. Mohamad F. Fakih (mail@khuta.org) + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU General Public License as published by + - the Free Software Foundation, either version 3 of the License, or + - (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU General Public License for more details. + - + - You should have received a copy of the GNU General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/> + --}% + +<%@ page import="ker.OperationController; cmn.Setting" %> +<html xmlns="http://www.w3.org/1999/xhtml" > +%{--xml:lang="ar" lang="ar" dir="rtl"--}% +<head> + + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + %{--<meta name="layout" content="main"/>--}% + + + %{--<b style="color: white">--}% + + + <title style="direction: ltr; text-align: left;">${OperationController.getPath('app.name') ? OperationController.getPath('app.name') + ' /Kanban': 'Nibras PKM /Kanban'} + %{--<g:meta name="app.version"/>--}% + + + + </title> + + + %{--<link rel="shortcut icon" href="${resource(dir: 'images', file: 'favicon-transparent.png')}" type="image/png"/>--}% + <link rel="shortcut icon" href="${resource(dir: 'images', file: 'calendar.ico')}" type="image/ico"/> + + + + <link rel="stylesheet" href="${resource(dir: 'css', file: 'chosen.css')}"/> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'jquery-ui-1.8.22.custom.css')}"/> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'jquery.continuousCalendar.css')}"/> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'jqueryui-editable.css')}"/> +%{-- <link rel="stylesheet" href="${resource(dir: 'css', file: 'layout-mine.css')}"/>--}% + <link rel="stylesheet" href="${resource(dir: 'css', file: 'main-kanban.css')}"/> +%{-- <link rel="stylesheet" href="${resource(dir: 'css', file: 'personalization.css')}"/>--}% + <link rel="stylesheet" href="${resource(dir: 'css', file: 'simpleSlider.css')}"/> + +%{-- <link rel="stylesheet" href="${resource(dir: 'css', file: 'uploader.css')}"/>--}% + + + + + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery-1.11.0_min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery-ui-1.10.4.custom.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'chosen.jquery.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'am2_SimpleSlider.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.address-1.5.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.continuousCalendar-latest.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.layout-latest_min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.purr.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.relatedselects.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.tablednd_0_5.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'jqueryui-editable.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'morris.js')}"></script> +%{-- <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.idletimeout.js')}"></script>--}% +%{-- <script type="text/javascript" src="${resource(dir: 'js', file: 'jquery.idletimer.js')}"></script>--}% + <script type="text/javascript" src="${resource(dir: 'js', file: 'mousetrap.min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'mousetrap-global-bind.min.js')}"></script> + + <script type="text/javascript" src="${resource(dir: 'js', file: 'raphael-min.js')}"></script> + <script type="text/javascript" src="${resource(dir: 'js', file: 'typeahead.bundle.js')}"></script> + + +%{-- <asset:javascript src="uploadr.manifest.js"/>--}% +%{-- <asset:javascript src="uploadr.demo.manifest.js"/>--}% +%{-- <asset:stylesheet href="uploadr.manifest.css"/>--}% +%{-- <asset:stylesheet href="uploadr.demo.manifest.css"/>--}% + + + %{--<r:layoutResources/>--}% + + <script type="text/javascript"> + + // $.address.state('/nibras/') + $.address.externalChange(function (event) { + // do something depending on the event.value property, e.g. + // $('#content').load(event.value + '.xml'); + // console.log('fired ' + event.value) + // + + // commented 03.07.2019 + // if (event.value != '/') + //jQuery('#centralArea').load(event.value) + }); + + /** + * UI Layout Callback: resizePaneAccordions + * + * This callback is used when a layout-pane contains 1 or more accordions + * - whether the accordion a child of the pane or is nested within other elements + * Assign this callback to the pane.onresize event: + * + * SAMPLE: + * < jQuery UI 1.9: $("#elem").tabs({ show: $.layout.callbacks.resizePaneAccordions }); + * > jQuery UI 1.9: $("#elem").tabs({ activate: $.layout.callbacks.resizePaneAccordions }); + * $("body").layout({ center__onresize: $.layout.callbacks.resizePaneAccordions }); + * + * Version: 1.2 - 2013-01-12 + * Author: Kevin Dalman (kevin.dalman@gmail.com) + */ + ; + (function ($) { + var _ = $.layout; + +// make sure the callbacks branch exists + if (!_.callbacks) _.callbacks = {}; + + _.callbacks.resizePaneAccordions = function (x, ui) { + // may be called EITHER from layout-pane.onresize OR tabs.show + var $P = ui.jquery ? ui : $(ui.newPanel || ui.panel); + // find all VISIBLE accordions inside this pane and resize them + $P.find(".ui-accordion:visible").each(function () { + var $E = $(this); + if ($E.data("accordion")) // jQuery < 1.9 + $E.accordion("resize"); + if ($E.data("ui-accordion")) // jQuery >= 1.9 + $E.accordion("refresh"); + }); + }; + })(jQuery); + + + jQuery(document).ready(function () { + + // for (var i = 0; i < localStorage.length; i++) { + // do something with localStorage.getItem(localStorage.key(i)); + // var key = localStorage.key(i) + // var value = localStorage[key] + + +// console.log('key ' + key + 'value' + value) +// if ((typeof value == 'string' || value instanceof String) && !value.contains('datum')) +// if (value.contains('pkm-')) +// document.getElementById('commandHistory').options.add(new Option(value, localStorage.key(i))) + + + // } + + + myLayout = $('body').layout({ + west__size: 360, + east__size: 360, + // east__initClosed: true, + east__togglerContent_closed: '<<', + // RESIZE Accordion widget when panes resize + west__onresize: $.layout.callbacks.resizePaneAccordions, + east__onresize: $.layout.callbacks.resizePaneAccordions, + onresize: $.layout.callbacks.resizePaneAccordions, + north__closable: false, + south__closable: false, + north__spacing_closed: 5 // big resizer-bar when open (zero height) + , north__resizable: false // OVERRIDE the pane-default of 'resizable=true' + , south__resizable: false // OVERRIDE the pane-default of 'resizable=true' + , north__spacing_open: 5 // no resizer-bar when open (zero height) + , south__spacing_open: 5 // no resizer-bar when open (zero height) + , south__spacing_closed: 5 // big resizer-bar when open (zero height) + + , east__spacing_open: 5 // no resizer-bar when open (zero height) + , east__spacing_closed: 25 // big resizer-bar when open (zero height) + , west__spacing_open: 0 // no resizer-bar when open (zero height) + , west__spacing_closed: 15 // big resizer-bar when open (zero height) +// , west__initClosed: true + , west__slideTrigger_open: 'mouseover' + , east__slideTrigger_open: 'mouseover' + + + }); + + + $.fn.editable.defaults.mode = 'inline'; + $.fn.editable.defaults.showbuttons = false; + + jQuery('.fg-button').hover( + function () { + jQuery(this).removeClass('ui-state-default').addClass('ui-state-focus'); + }, + function () { + jQuery(this).removeClass('ui-state-focus').addClass('ui-state-default'); + } + ); + + var matched, browser; + + jQuery.uaMatch = function (ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[1] || "", + version: match[2] || "0" + }; + }; + + matched = jQuery.uaMatch(navigator.userAgent); + browser = {}; + + if (matched.browser) { + browser[matched.browser] = true; + browser.version = matched.version; + } + +// Chrome is Webkit, but Webkit is also Safari. + if (browser.chrome) { + browser.webkit = true; + } else if (browser.webkit) { + browser.safari = true; + } + + jQuery.browser = browser; + + // this layout could be created with NO OPTIONS - but showing some here just as a sample... + // myLayout = jQuery('body').layout(); -- syntax with No Options + +// jQuery('input').iCheck({ +// checkboxClass: 'icheckbox_minimal-grey', +// radioClass: 'iradio_minimal-grey', +// increaseArea: '-20%' // optional +// }); + +// jQuery('#searchForm').load('/nibras/generics/hqlSearchForm/T') + jQuery('#tagCloud').load('/nibras/report/tagCloud') + +// jQuery('#centralArea').load('/nibras/generics/recentRecords') + +// jQuery('#quickAddTextField').select(); +// jQuery('#quickAddTextField').focus(); + + jQuery('#range_start').val('') + jQuery('#range_end').val('') + + jQuery("#dateRange1").continuousCalendar({ + "selectToday": false, + "weeksBefore": "40",//"1/1/2012", + "weeksAfter": "8", + "minimumRange": "-1", + %{--"disabledDates": "${filledInDates}",--}% + "disabledDatesMy": "${[]}", + "fadeOutDuration": "0", + isPopup: false, + callback: function () { + jQuery('#centralArea').load('${createLink(controller: 'report', action: 'saveDateSelection')}?date1=' + + jQuery('#range_start').val() + '&date2=' + + jQuery('#range_end').val())// + '&level=d') + } + }) + + $("#accordionEast").accordion({ + heightStyle: "fill", + header: "h3", + fillSpace: true, + event: "click", + active: 0, + collapsible: false, + icons: { + header: "ui-icon-circle-arrow-e", + headerSelected: "ui-icon-circle-arrow-s" + } + + }); + + $("#accordionWest").accordion({ + heightStyle: "fill", + fillSpace: true, + header: "h3", + event: "click", + active: 0, + collapsible: false, + icons: { + header: "ui-icon-circle-arrow-e", + headerSelected: "ui-icon-circle-arrow-s" + } + + }); + + +$("#accordionCenter").accordion({ + heightStyle: "fill", + header: "h6", + fillSpace: true, + event: "click", + active: 0, + collapsible: false, + icons: { + header: "ui-icon-circle-arrow-e", + headerSelected: "ui-icon-circle-arrow-s" + } + + }); + + + + + + + Mousetrap.bindGlobal('ctrl+1', function (e) { + jQuery('#accordionCenter').accordion({ active: 0}); + }); + Mousetrap.bindGlobal('ctrl+2', function (e) { + jQuery('#accordionCenter').accordion({ active: 1}); + }); + Mousetrap.bindGlobal('ctrl+3', function (e) { + jQuery('#accordionCenter').accordion({ active: 2}); + }); + Mousetrap.bindGlobal('ctrl+4', function (e) { + jQuery('#accordionCenter').accordion({ active: 3}); + }); + + Mousetrap.bindGlobal('esc', function (e) { +// jQuery("html, body").animate({ scrollTop: 0 }, "fast"); +// jQuery('#centralArea').html(''); + jQuery('#speedsearch').select(); jQuery('#speedsearch').focus(); +// jQuery('#quickAddTextFieldBottomTop').select(); +// jQuery('#3rdPanel').html(''); +// jQuery('#sandboxPanel').html(''); +// jQuery('#commandBars').addClass('navHidden'); + // jQuery('#accordionEast').accordion({ active: 3}); + // jQuery('#accordionWest').accordion({ active: 3}); +// jQuery('#quickAddTextField').scrollTop(0); + }); + +// Mousetrap.bindGlobal('esc', function (e) { +// +//// jQuery('#centralArea').html(''); +//// jQuery('#quickAddTextField').focus(); +//// jQuery('#quickAddTextField').select(); +// jQuery('#quickAddRecordTextArea').select().focus(); +// +// }); + +// Mousetrap.bindGlobal('f6', function (e) { +// jQuery('#centralArea').html(''); +// jQuery('#quickAddTextField').focus(); +// jQuery('#quickAddTextField').select(); +// +// }); + + var collapsed = false; + Mousetrap.bindGlobal('f9', function (e) { + if (!collapsed) { + jQuery('#topRegion').addClass('navHidden'); + jQuery('#navMenu').addClass('navHidden'); + jQuery('#southRegion').addClass('navHidden'); + collapsed = true + } + else { + jQuery('#topRegion').removeClass('navHidden'); + jQuery('#navMenu').removeClass('navHidden'); + jQuery('#southRegion').removeClass('navHidden'); + collapsed = false + } + + }); + + Mousetrap.bind('n', function (e) { + jQuery('.nextLink').click() + }); + + Mousetrap.bind('ctrl+s', function (e) { + jQuery('#quickAddRecordSubmit').click() + }); + + Mousetrap.bind('p', function (e) { + jQuery('.prevLink').click() + }); + + /* + For modifier keys you can use shift, ctrl, alt, option, meta, and command. + + Other special keys are backspace, tab, enter, return, capslock, esc, + escape, space, pageup, pagedown, end, home, left, up, right, down, ins, and del. + + Any other key you should be able to reference by name like a, /, $, *, or =. + + */ + + jQuery("#quickAddTextField").keypress(function (e) { + if (e.keyCode == 13 && e.shiftKey) { + jQuery('#quickAddXcdSubmit').click(); + e.preventDefault(); +// jQuery('#quickAddTextField').addClass('shiftEnterPressed'); +// jQuery("#quickAddTextField").fadeOut("fast", function () { + jQuery('#quickAddTextField').addClass('shiftEnterPressed'); + setTimeout(dosth, 400); + } + }); + function dosth() { + jQuery('#quickAddTextField').removeClass('shiftEnterPressed') + } + +// Mousetrap.bindGlobal('f2', function (e) { +// jQuery('#quickAddXcdSubmit').click(); +// jQuery('#addXcdFormDaftarSubmit').click(); +// jQuery('#descriptionDaftar').focus(); +// jQuery('#quickAddXcdField').focus(); +// }); + + //Todo how to disable formRemote submission + // document.forms.quickAddForm['submit'].disabled = true; + + + jQuery(window).bind('beforeunload', function () { + return 'Are you sure you want to leave the application?'; + }); + + + jQuery.ajaxSetup({ + beforeSend: function () { + $('#spinner2').show(); + }, + complete: function () { + $('#spinner2').hide(); + } + , + success: function () { + $('#spinner2').hide(); + } + }); + + jQuery(document).ajaxComplete(function () { + $('#spinner2').hide(); + }); + + jQuery(document).ajaxStop(function () { + $('#spinner2').hide(); + }); + jQuery(document).ajaxSuccess(function () { + $('#spinner2').hide(); + }); + + $(document).ajaxError(function () { + $('#spinner2').hide(); + }); + + jQuery('#descriptionDaftar').focus(); + }); + + </script> + +</head> + +<body> + +<g:render template="/appKanban/regions" model="[htmlContent: htmlContent]"/> +<div id="idletimeout"></div> + + + +<script type="text/javascript"> + jQuery('#selectAll').click(function() { + if (this.checked) { + jQuery(':checkbox').each(function() {this.checked = true;}); + } else { + jQuery(':checkbox').each(function() { + this.checked = false; + }); + } + }); + + // }); + +</script> +</body> +</html> \ No newline at end of file diff --git a/grails-app/views/appMain/_east.gsp b/grails-app/views/appMain/_east.gsp index c355a05..b82deb4 100644 --- a/grails-app/views/appMain/_east.gsp +++ b/grails-app/views/appMain/_east.gsp @@ -2,818 +2,810 @@ <div id="accordionEast" class="basic"> - <h3><a href="#"> - <g:message code="ui.details"></g:message> + <h3><a href="#"> + <g:message code="ui.details"></g:message> - </a></h3> + </a></h3> - <div id="3rdPanel"> + <div id="3rdPanel"> - </div> + </div> - %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% - %{--<h3><a href="#">--}% - %{--<g:message code="ui.sandbox"></g:message>--}% + %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% + %{--<h3><a href="#">--}% + %{--<g:message code="ui.sandbox"></g:message>--}% - %{--</a></h3>--}% + %{--</a></h3>--}% - %{--<div id='sandboxPanel'>--}% + %{--<div id='sandboxPanel'>--}% - %{--</div>--}% - %{--</sec:ifAnyGranted>--}% + %{--</div>--}% + %{--</sec:ifAnyGranted>--}% - %{--<h4>Add records</h4>--}% - %{--<hr/>--}% + %{--<h4>Add records</h4>--}% + %{--<hr/>--}% - <h3 class="accordionPanelAdd" style="margin-top: 5px;"><a href="#"> - <g:message code="ui.add"></g:message> - </a></h3> + <h3 class="accordionPanelAdd" style="margin-top: 5px;"><a href="#"> + <g:message code="ui.add"></g:message> + </a></h3> - <div id=''> + <div id=''> - <b>Using sheet:</b> + <b>Using sheet:</b> - <ul> - <g:if test="${ker.OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes' ? true : false}"> - <li><g:remoteLink controller="report" action="indicatorPanorama" - update="centralArea" - title="Update indicators"> - <g:message code="ui.indicators"></g:message> - </g:remoteLink></li> + <ul> + <g:if test="${ker.OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <li><g:remoteLink controller="report" action="indicatorPanorama" + update="centralArea" + title="Update indicators"> + <g:message code="ui.indicators"></g:message> + </g:remoteLink></li> - </g:if> + </g:if> - <g:if test="${OperationController.getPath('payments.enabled')?.toLowerCase() == 'yes' ? true : false}"> - <li><g:remoteLink controller="report" action="paymentPanorama" - update="centralArea" - title="Enter recent payments"> - Payments - </g:remoteLink></li> - </g:if> - <li> - <g:remoteLink controller="report" action="enterTasksWithContext" + <g:if test="${OperationController.getPath('payments.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <li><g:remoteLink controller="report" action="paymentPanorama" update="centralArea" - title="Enter new tasks"> - Tasks - </g:remoteLink> + title="Enter recent payments"> + Payments + </g:remoteLink></li> + </g:if> + <li> + <g:remoteLink controller="report" action="enterTasksWithContext" + update="centralArea" + title="Enter new tasks"> + Tasks + </g:remoteLink> - </li> - <li> - <g:remoteLink controller="report" action="enterJournalWithType" - update="centralArea" - title="Enter new journal entries"> - Journal - </g:remoteLink> + </li> + <li> + <g:remoteLink controller="report" action="enterJournalWithType" + update="centralArea" + title="Enter new journal entries"> + Journal + </g:remoteLink> - </li> + </li> - </ul> - <br/> - <hr/> - <br/> - <b>Using forms:</b> - - - <span style="-moz-column-count: 2"> - <ul style="list-style: square"> - - <g:each in="${ - [ - [enabled: OperationController.getPath('goals.enabled')?.toLowerCase() == 'yes', code: 'G', name: 'Goals', controller: 'mcs.Goal'], - [enabled: OperationController.getPath('tasks.enabled')?.toLowerCase() == 'yes', code: 'T', name: 'Tasks', controller: 'mcs.Task'], - [enabled: OperationController.getPath('planner.enabled')?.toLowerCase() == 'yes', code: 'P', name: 'Planner', controller: 'mcs.Planner'], - [enabled: OperationController.getPath('journal.enabled')?.toLowerCase() == 'yes', code: 'J', name: 'Journal', controller: 'mcs.Journal'], - [enabled: OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes', code: 'I', name: 'Indicator', controller: 'app.IndicatorData'], - [enabled: OperationController.getPath('Payment.enabled')?.toLowerCase() == 'yes', code: 'Q', name: 'Payment', controller: 'app.Payment'], - [enabled: OperationController.getPath('writings.enabled')?.toLowerCase() == 'yes', code: 'W', name: 'Writing', controller: 'mcs.Writing'], - [enabled: OperationController.getPath('notes.enabled')?.toLowerCase() == 'yes', code: 'N', name: 'Notes', controller: 'app.IndexCard',], - [enabled: OperationController.getPath('resources.enabled')?.toLowerCase() == 'yes', code: 'R', name: 'Resources', controller: 'mcs.Book'], - [enabled: OperationController.getPath('contacts.enabled')?.toLowerCase() == 'yes', code: 'S', name: 'Contact', controller: 'app.Contact'] - ].grep { it.enabled == true } - }" - var="i"> - %{--todo--}% - - <g:remoteLink controller="generics" action="fetchAddForm" - params="[entityController: i.controller, updateRegion: 'centralArea']" - update="centralArea"> - <li> - <span style="font-size: 12px; padding: 2px;"> - ${i.name} (${i.code}) - </span> - </li> - </g:remoteLink> + </ul> + <br/> + <hr/> + <br/> + <b>Using forms:</b> + + + <span style="-moz-column-count: 2"> + <ul style="list-style: square"> + + <g:each in="${ + [ + [enabled: OperationController.getPath('goals.enabled')?.toLowerCase() == 'yes', code: 'G', name: 'Goals', controller: 'mcs.Goal'], + [enabled: OperationController.getPath('tasks.enabled')?.toLowerCase() == 'yes', code: 'T', name: 'Tasks', controller: 'mcs.Task'], + [enabled: OperationController.getPath('planner.enabled')?.toLowerCase() == 'yes', code: 'P', name: 'Planner', controller: 'mcs.Planner'], + [enabled: OperationController.getPath('journal.enabled')?.toLowerCase() == 'yes', code: 'J', name: 'Journal', controller: 'mcs.Journal'], + [enabled: OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes', code: 'I', name: 'Indicator', controller: 'app.IndicatorData'], + [enabled: OperationController.getPath('Payment.enabled')?.toLowerCase() == 'yes', code: 'Q', name: 'Payment', controller: 'app.Payment'], + [enabled: OperationController.getPath('writings.enabled')?.toLowerCase() == 'yes', code: 'W', name: 'Writing', controller: 'mcs.Writing'], + [enabled: OperationController.getPath('notes.enabled')?.toLowerCase() == 'yes', code: 'N', name: 'Notes', controller: 'app.IndexCard',], + [enabled: OperationController.getPath('resources.enabled')?.toLowerCase() == 'yes', code: 'R', name: 'Resources', controller: 'mcs.Book'], + [enabled: OperationController.getPath('contacts.enabled')?.toLowerCase() == 'yes', code: 'S', name: 'Contact', controller: 'app.Contact'] + ].grep { it.enabled == true } + }" + var="i"> + %{--todo--}% - </g:each> - </ul> + <g:remoteLink controller="generics" action="fetchAddForm" + params="[entityController: i.controller, updateRegion: 'centralArea']" + update="centralArea"> + <li> + <span style="font-size: 12px; padding: 2px;"> + ${i.name} (${i.code}) + </span> + </li> + </g:remoteLink> - </span> + </g:each> + </ul> + </span> - <br/><hr/> - <br/> - <b>By importing files named in Nibras format:</b> + <br/><hr/> + <br/> - <ul> + <b>By importing files named in Nibras format:</b> - <li> + <ul> - <g:if test="${OperationController.getPath('import.enabled')?.toLowerCase() == 'yes' ? true : false}"> - <g:remoteLink controller="import" action="importLocalFiles" - update="centralArea" - before="jQuery.address.value(jQuery(this).attr('href'));" - title="Import local files"> - Import files (in <b>${OperationController.getPath('root.rps1.path')}</b>) - </g:remoteLink> - </g:if> - </li> - </ul> - <br/><hr/> - <br/> - <br/> + <li> - </div> + <g:if test="${OperationController.getPath('import.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <g:remoteLink controller="import" action="importLocalFiles" + update="centralArea" + before="jQuery.address.value(jQuery(this).attr('href'));" + title="Import local files"> + Import files (in <b>${OperationController.getPath('root.rps1.path')}</b>) + </g:remoteLink> + </g:if> + </li> + </ul> + <br/><hr/> + <br/> + <br/> - <h3 class="accordionPanelAdd"><a href="#"> - <g:message code="ui.add.full.art"></g:message> + </div> - </a></h3> + <h3 class="accordionPanelAdd"><a href="#"> + <g:message code="ui.add.full.art"></g:message> - <div id='addArticle'> + </a></h3> - <g:formRemote name="addArticleFormNgs" id="addArticleFormNgs" - url="[controller: 'indexCard', action: 'addArticleFormNgs']" - update="centralArea" - method="post"> - - <g:select name="language" from="${['ar', 'fr', 'en', 'de', 'fa']}" - id="language" - value="ar" - noSelection="${['null': '']}"/> - <g:select name="priority" from="${(1..4)}" - id="priorityArticle" - value="${2}"/> - - <g:select name="department.id" from="${Department.list([sort: 'code'])}" - optionKey="id" id="department" - optionValue="code" - noSelection="${['null': '']}"/> - - <g:select name="course.id" from="${Course.list()}" - optionKey="id" class="chosen" id="course" - optionValue="summary" - noSelection="${['null': '']}"/> - <br/> - <pkm:datePicker name="publishedOn" placeholder="Date" id="34563453" value="${new Date()}"/> - %{--~<g:checkBox name="approximateDate" id="approximateDate" value=""/>--}% + <div id='addArticle'> + <g:formRemote name="addArticleFormNgs" id="addArticleFormNgs" + url="[controller: 'indexCard', action: 'addArticleFormNgs']" + update="centralArea" + method="post"> - <g:select name="type.id" from="${app.parameters.ResourceType.list([sort: 'code'])}" - optionKey="id" class="chosen chosen-rtl" id="type" - optionValue="name" - value="${ResourceType.findByCode('art')?.id}" - noSelection="${['null': '']}"/> + <g:select name="language" from="${['ar', 'fr', 'en', 'de', 'fa']}" + id="language" + value="ar" + noSelection="${['null': '']}"/> + <g:select name="priority" from="${(1..4)}" + id="priorityArticle" + value="${2}"/> + <g:select name="department.id" from="${Department.list([sort: 'code'])}" + optionKey="id" id="department" + optionValue="code" + noSelection="${['null': '']}"/> + <g:select name="course.id" from="${Course.list()}" + optionKey="id" class="chosen" id="course" + optionValue="summary" + noSelection="${['null': '']}"/> + <br/> + <pkm:datePicker name="publishedOn" placeholder="Date" id="34563453" value="${new Date()}"/> + %{--~<g:checkBox name="approximateDate" id="approximateDate" value=""/>--}% - <a onclick="clearFormFields()">Clear</a> - <br/> - <g:textField placeholder="Title" name="title" id="title" value="" - style="background: #e8efe7; width: 100%;" dir="auto"/> - <g:textArea cols="80" rows="12" placeholder="Full text" name="fullText" id="fullText" - value="" dir="auto" - style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 200px !important;"/> - <br/> + <g:select name="type.id" from="${app.parameters.ResourceType.list([sort: 'code'])}" + optionKey="id" class="chosen chosen-rtl" id="type" + optionValue="name" + value="${ResourceType.findByCode('art')?.id}" + noSelection="${['null': '']}"/> - <g:textField placeholder="url" name="url" id="url" value="" style="width: 100%;"/> - %{--NR: <g:textField placeholder="sourceFree" name="sourceFree" id="sourceFree" value="" style="width: 100%;"/>--}% - <br/> - <br/> - %{--<g:select name="chosenTagsArt" from="${Tag.list()}" multiple=""--}% - %{--size="80" style="min-width: 200px; min-height: 40px;"--}% - %{--value="" optionKey="id"--}% - %{--class="chosen chosen-rtl" id="chosenTagsArt"--}% - %{--optionValue="name"--}% - %{--noSelection="${['null': '']}"/>--}% - %{----}% - %{--<br/>--}% - %{--<br/>--}% - <g:submitButton name="save" value="Save" - style="height: 25px; margin: 0px; width: 100% !important; background: #efece0" - id="4568734523" - class="fg-button ui-widget ui-state-default"/> - </g:formRemote> + <a onclick="clearFormFields()">Clear</a> + <br/> + <g:textField placeholder="Title" name="title" id="title" value="" + style="background: #e8efe7; width: 100%;" dir="auto"/> - </div> + <g:textArea cols="80" rows="12" placeholder="Full text" name="fullText" id="fullText" + value="" dir="auto" + style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 200px !important;"/> + <br/> + <g:textField placeholder="url" name="url" id="url" value="" style="width: 100%;"/> + %{--NR: <g:textField placeholder="sourceFree" name="sourceFree" id="sourceFree" value="" style="width: 100%;"/>--}% - <h3 class="accordionPanelAdd"><a href="#"> - <g:message code="ui.add.full.note"></g:message> + <br/> + <br/> + %{--<g:select name="chosenTagsArt" from="${Tag.list()}" multiple=""--}% + %{--size="80" style="min-width: 200px; min-height: 40px;"--}% + %{--value="" optionKey="id"--}% + %{--class="chosen chosen-rtl" id="chosenTagsArt"--}% + %{--optionValue="name"--}% + %{--noSelection="${['null': '']}"/>--}% + %{----}% + %{--<br/>--}% + %{--<br/>--}% + + <g:submitButton name="save" value="Save" + style="height: 25px; margin: 0px; width: 100% !important; background: #efece0" + id="4568734523" + class="fg-button ui-widget ui-state-default"/> + </g:formRemote> + + </div> + + + <h3 class="accordionPanelAdd"><a href="#"> + <g:message code="ui.add.full.note"></g:message> + + </a></h3> + + <div id='addXcd'> + + <g:formRemote name="addXcdFormNgs" id="addXcdFormNgs" + url="[controller: 'indexCard', action: 'addXcdFormNgs']" + update="centralArea" + onComplete="clearFormFields()" + method="post"> + + <g:select name="language" from="${['ar', 'fr', 'en', 'de', 'fa']}" + id="language" + value="ar" + noSelection="${['null': '']}"/> + + <g:select name="priority" from="${(1..4)}" + id="priorityNote" + value="${2}"/> + + + <g:select name="department.id" from="${Department.list([sort: 'code'])}" + optionKey="id" id="department" + optionValue="code" + noSelection="${['null': 'd-']}"/> + + <g:select name="course.id" + from="${Course.executeQuery('from Course c where c.bookmarked = true order by c.department.orderNumber asc, c.orderNumber asc')}" + optionKey="id" + id="courseNote" + class="chosen chosen-rtl" + optionValue="summary" + noSelection="${['null': 'No course']}"/> + <br/> + <pkm:datePicker name="writtenOn" placeholder="Date" id="34563453" value="${new Date()}"/> + %{--~<g:checkBox name="approximateDate" id="approximateDate" value=""/>--}% - </a></h3> + <g:select name="type.id" from="${WritingType.list([sort: 'code'])}" + optionKey="id" + id="typeNote" + class="chosen chosen-rtl" + optionValue="code" + value="${WritingType.findByCode('usr')?.id}" + noSelection="${['null': 'No type']}"/> - <div id='addXcd'> + <a onclick="clearFormFields()">Clear</a> - <g:formRemote name="addXcdFormNgs" id="addXcdFormNgs" - url="[controller: 'indexCard', action: 'addXcdFormNgs']" - update="centralArea" - onComplete="clearFormFields()" - method="post"> - - <g:select name="language" from="${['ar', 'fr', 'en', 'de', 'fa']}" - id="language" - value="ar" - noSelection="${['null': '']}"/> - - <g:select name="priority" from="${(1..4)}" - id="priorityNote" - value="${2}"/> - - - <g:select name="department.id" from="${Department.list([sort: 'code'])}" - optionKey="id" id="department" - optionValue="code" - noSelection="${['null': 'd-']}"/> - - <g:select name="course.id" - from="${Course.executeQuery('from Course c where c.bookmarked = true order by c.department.orderNumber asc, c.orderNumber asc')}" - optionKey="id" - id="courseNote" - class="chosen chosen-rtl" - optionValue="summary" - noSelection="${['null': 'No course']}"/> - <br/> - <pkm:datePicker name="writtenOn" placeholder="Date" id="34563453" value="${new Date()}"/> - %{--~<g:checkBox name="approximateDate" id="approximateDate" value=""/>--}% - - <g:select name="type.id" from="${WritingType.list([sort: 'code'])}" - optionKey="id" - id="typeNote" - class="chosen chosen-rtl" - optionValue="code" - value="${WritingType.findByCode('usr')?.id}" - noSelection="${['null': 'No type']}"/> + <br/> - <a onclick="clearFormFields()">Clear</a> + %{--<g:select name="writing.id"--}% + %{--from="${Writing.executeQuery('from Writing w where w.course.bookmarked = ? order by w.course.department.orderNumber asc, w.course.orderNumber asc, w.orderNumber asc', [true])}"--}% + %{--optionKey="id"--}% + %{--id="writingNote"--}% + %{--optionValue="summary"--}% + %{--class="chosen chosen-rtl"--}% + %{--style="width: 48%; text-align: right; direction:rtl"--}% + %{--value="${null}"--}% + %{--noSelection="${['null': 'No writing']}"/>--}% + %{----}% + + + + %{--<g:select name="contact.id"--}% + %{--from="${app.Contact.executeQuery('from Contact c order by c.summary asc')}"--}% + %{--optionKey="id"--}% + %{--id="contactNote"--}% + %{--optionValue="summary"--}% + %{--class="chosen chosen-rtl"--}% + %{--style="width: 48%; text-align: right; direction:rtl"--}% + %{--value="${null}"--}% + %{--noSelection="${['null': '']}"/>--}% + + + %{----}% + %{--<br/>--}% + %{--<g:select name="book.id"--}% + %{--from="${Book.executeQuery('from Book r where r.status.code = ? order by r.course.department.orderNumber asc, r.course.orderNumber asc, r.orderNumber asc', ['mkt'])}"--}% + %{--id="bookId"--}% + %{--optionKey="id"--}% + %{--optionValue="title"--}% + %{--class="chosen chosen-rtl"--}% + %{--style="width: 99%; text-align: right; direction:rtl"--}% + %{--value="${null}"--}% + %{--noSelection="${['null': '']}"/>--}% + + %{----}% + + <g:textField placeholder="Summary" name="summary" id="summary" value="" + style="background: #e8efe7; width: 100%; ;" dir="auto"/> + + <g:textArea cols="80" rows="12" placeholder="Description" name="description" id="description" + value="" dir="auto" + style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 150px !important;"/> + <br/> - <br/> + R ID: <g:textField placeholder="book.id" name="book.id" id="book.id" value="" style="width: 70%;"/> - %{--<g:select name="writing.id"--}% - %{--from="${Writing.executeQuery('from Writing w where w.course.bookmarked = ? order by w.course.department.orderNumber asc, w.course.orderNumber asc, w.orderNumber asc', [true])}"--}% - %{--optionKey="id"--}% - %{--id="writingNote"--}% - %{--optionValue="summary"--}% - %{--class="chosen chosen-rtl"--}% - %{--style="width: 48%; text-align: right; direction:rtl"--}% - %{--value="${null}"--}% - %{--noSelection="${['null': 'No writing']}"/>--}% - %{----}% - - - - %{--<g:select name="contact.id"--}% - %{--from="${app.Contact.executeQuery('from Contact c order by c.summary asc')}"--}% - %{--optionKey="id"--}% - %{--id="contactNote"--}% - %{--optionValue="summary"--}% - %{--class="chosen chosen-rtl"--}% - %{--style="width: 48%; text-align: right; direction:rtl"--}% - %{--value="${null}"--}% - %{--noSelection="${['null': '']}"/>--}% - - - %{----}% - %{--<br/>--}% - %{--<g:select name="book.id"--}% - %{--from="${Book.executeQuery('from Book r where r.status.code = ? order by r.course.department.orderNumber asc, r.course.orderNumber asc, r.orderNumber asc', ['mkt'])}"--}% - %{--id="bookId"--}% - %{--optionKey="id"--}% - %{--optionValue="title"--}% - %{--class="chosen chosen-rtl"--}% - %{--style="width: 99%; text-align: right; direction:rtl"--}% - %{--value="${null}"--}% - %{--noSelection="${['null': '']}"/>--}% - - %{----}% - - <g:textField placeholder="Summary" name="summary" id="summary" value="" - style="background: #e8efe7; width: 100%; ;" dir="auto"/> - - <g:textArea cols="80" rows="12" placeholder="Description" name="description" id="description" - value="" dir="auto" - style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 150px !important;"/> - <br/> + Pg. <g:textField placeholder="pages" name="pages" id="pages" value="" style="width: 30%;"/> + <br/> + <g:textField placeholder="url" name="url" id="url" value="" placehoder="url" style="width: 100%;"/> + %{--<br/>--}% + %{--<br/>--}% + %{--<g:select name="chosenTags" from="${Tag.list()}" multiple=""--}% + %{--size="80" style="min-width: 200px; min-height: 50px;"--}% + %{--value="" optionKey="id"--}% + %{--class="chosen chosen-rtl" id="chosenTags"--}% + %{--optionValue="name"--}% + %{--noSelection="${['null': '']}"/>--}% - R ID: <g:textField placeholder="book.id" name="book.id" id="book.id" value="" style="width: 70%;"/> - - Pg. <g:textField placeholder="pages" name="pages" id="pages" value="" style="width: 30%;"/> - <br/> - <g:textField placeholder="url" name="url" id="url" value="" placehoder="url" style="width: 100%;"/> - %{--<br/>--}% - %{--<br/>--}% - %{--<g:select name="chosenTags" from="${Tag.list()}" multiple=""--}% - %{--size="80" style="min-width: 200px; min-height: 50px;"--}% - %{--value="" optionKey="id"--}% - %{--class="chosen chosen-rtl" id="chosenTags"--}% - %{--optionValue="name"--}% - %{--noSelection="${['null': '']}"/>--}% + <br/> - <br/> + <g:submitButton name="save" value="Save" - <g:submitButton name="save" value="Save" + style="height: 35px; margin: 0px; width: 100% !important; background: #efece0" + id="45634523" + class="fg-button ui-widget ui-state-default"/> + </g:formRemote> - style="height: 35px; margin: 0px; width: 100% !important; background: #efece0" - id="45634523" - class="fg-button ui-widget ui-state-default"/> - </g:formRemote> + </div> - </div> + <h3 class="accordionPanelAdd"><a href="#"> + <g:message code="ar.daftar"></g:message> + </a></h3> - <h3 class="accordionPanelAdd"><a href="#"> - <g:message code="ar.daftar"></g:message> - </a></h3> + <div id='daftarDiv'> - <div id='daftarDiv'> + <span id="topDaftarArea" + style="font-style: italic; padding-right: 15px; text-align: right; font-size: small; color: darkgreen"> - <span id="topDaftarArea" - style="font-style: italic; padding-right: 15px; text-align: right; font-size: small; color: darkgreen" - > + </span> - </span> + <g:formRemote name="addXcdFormDaftar" id="addXcdFormDaftar" + url="[controller: 'indexCard', action: 'addXcdFormDaftar']" + update="subDaftarArea" + onComplete="jQuery('#descriptionDaftar').val('');jQuery('#topDaftarArea').html(''); jQuery('#descriptionDaftar').focus();" + method="post"> - <g:formRemote name="addXcdFormDaftar" id="addXcdFormDaftar" - url="[controller: 'indexCard', action: 'addXcdFormDaftar']" - update="subDaftarArea" - onComplete="jQuery('#descriptionDaftar').val('');jQuery('#topDaftarArea').html(''); jQuery('#descriptionDaftar').focus();" - method="post"> + %{--onkeyup="jQuery('#topDaftarArea').load('/nibras/indexCard/extractTitle/', {'typing': this.value})"--}% + <g:textArea cols="80" rows="12" placeholder="title (line 1) - details (from line 2 till the end)" + name="description" id="descriptionDaftar" + value="" + style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 120px !important;"/> - %{--onkeyup="jQuery('#topDaftarArea').load('/nibras/indexCard/extractTitle/', {'typing': this.value})"--}% - <g:textArea cols="80" rows="12" placeholder="title (line 1) / details (line 2 - end)" name="description" id="descriptionDaftar" + <br/> - value="" - style="font-family: tahoma; font-size: small; background: #f7fff6; width: 100%; height: 120px !important;"/> + <g:submitButton name="save" value="Save" + style="text-align: center; margin: 0px; width: 84% !important; background: #efece0" + id="addXcdFormDaftarSubmit" + class="fg-button ui-widget ui-state-default"/> + <g:select name="type" from="${['Jy', 'Jt', 'N', 'W', 'T', 'G', 'R']}" + id="typeField" + value="N"/> - <br/> + </g:formRemote> - <g:submitButton name="save" value="Save" - style="text-align: center; margin: 0px; width: 84% !important; background: #efece0" - id="addXcdFormDaftarSubmit" - class="fg-button ui-widget ui-state-default"/> - <g:select name="type" from="${['Jy', 'Jt', 'N', 'W', 'T', 'G', 'R']}" - id="typeField" - value="N"/> - </g:formRemote> + <span id="subDaftarArea"> + </span> - <span id="subDaftarArea"> + <br/> - </span> + <a onclick="openNoteTaker()" href="javascript:void(0);" target="_self"> + ↗ + ↗ + Open in a dedicated window. + </a> - <br/> - <br/> - <a href="${createLink(controller: 'page', action:'appDaftar')}" target="_self"> - ↗ - ↗ - </a> + </div> - </div> + %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% + %{--<h4>Configuration</h4>--}% + %{--<hr/>--}% + <h3 class="accordionPanelSettings" style="margin-top: 5px;"><a href="#"> + <g:message code="ui.settings"></g:message> - %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% - %{--<h4>Configuration</h4>--}% - %{--<hr/>--}% - <h3 class="accordionPanelSettings" style="margin-top: 5px;"><a href="#"> - <g:message code="ui.settings"></g:message> + </a></h3> - </a></h3> + <div> - <div> - - <ul class="settingsUL"> - <li> - Configuration - <ul> - <li> - <g:remoteLink controller="page" action="settingsMain" update="centralArea"> - Main settings list (${Setting.countByBookmarked(true)}) - </g:remoteLink> + <ul class="settingsUL"> + <li> + Configuration + <ul> + <li> + <g:remoteLink controller="page" action="settingsMain" update="centralArea"> + Main settings list (${Setting.countByBookmarked(true)}) + </g:remoteLink> - </li> - <li> - <g:remoteLink controller="page" action="settingsFull" update="centralArea"> + </li> + <li> + <g:remoteLink controller="page" action="settingsFull" update="centralArea"> Full settings list (${Setting.count()}) </g:remoteLink></li> - <li> + <li> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'app.parameters.CommandPrefix', name: 'Command prefix']"/> - </li> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'app.parameters.CommandPrefix', name: 'Command prefix']"/> + </li> + <li> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.parameters.SavedSearch', name: 'Saved search']"/> + </li> + <g:if test="${OperationController.getPath('pkm-actions.enabled')?.toLowerCase() == 'yes' ? true : false}"> <li> <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.parameters.SavedSearch', name: 'Saved search']"/> + model="[controller: 'cmn.Setting', name: 'Setting']"/> </li> - <g:if test="${OperationController.getPath('pkm-actions.enabled')?.toLowerCase() == 'yes' ? true : false}"> - <li> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'cmn.Setting', name: 'Setting']"/> - </li> - </g:if> - </ul> + </g:if> + </ul> - </li> + </li> - %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% - %{--<td>--}% - %{--<input type="radio" name="myRadios" onchange="singleDisplay();" value="Single" />--}% - %{--<input type="radio" name="myRadios" onchange="dualDisplay();" value="dual display" />--}% - %{--<a id="singleDisplay"--}% - %{--title="Single display">--}% - %{--Single--}% - %{-- --}% - %{-- --}% - %{--<a id="dualDisplay"--}% - %{--title="Dual display">--}% - %{--dual display--}% - %{--</a>--}% - %{--</td>--}% + %{--<sec:ifAnyGranted roles="ROLE_ADMIN">--}% + %{--<td>--}% + %{--<input type="radio" name="myRadios" onchange="singleDisplay();" value="Single" />--}% + %{--<input type="radio" name="myRadios" onchange="dualDisplay();" value="dual display" />--}% + %{--<a id="singleDisplay"--}% + %{--title="Single display">--}% + %{--Single--}% + %{-- --}% + %{-- --}% + %{--<a id="dualDisplay"--}% + %{--title="Dual display">--}% + %{--dual display--}% + %{--</a>--}% + %{--</td>--}% + <li> + Execute code + <ul> <li> - Execute code - <ul> - <li> - <a href="${createLink(controller: 'console')}" target="_blank"> + <a href="${createLink(controller: 'console')}" target="_blank"> - <g:message code="ui.console"></g:message> - </a> - </li> + <g:message code="ui.console"></g:message> + </a> + </li> </ul> %{--</sec:ifAnyGranted>--}% - <li> - Record presentation - <ul> - <li> - <g:remoteLink controller="report" action="showLine1Only" - update="logArea" - title="Selected records"> - <g:if test="${session['showLine1Only'] == 'on'}"> - <b>summarized</b> - </g:if> - <g:else> - summarized - </g:else> - </g:remoteLink> - </li> - <li><g:remoteLink controller="report" action="showFullCard" - update="logArea" - title="Selected records"> - <g:if test="${session['showFullCard'] == 'on'}"> - <b>full</b> + <li> + Record presentation + <ul> + <li> + <g:remoteLink controller="report" action="showLine1Only" + update="logArea" + title="Selected records"> + <g:if test="${session['showLine1Only'] == 'on'}"> + <b>summarized</b> </g:if> <g:else> - full + summarized </g:else> </g:remoteLink> - </li> - </ul> - - </li> - - - - <li> - Folders availability - <ul> - <li> - <pkm:checkFolder name='rps2' path="${OperationController.getPath('root.rps2.path')}"/> - - </li> - <li> - <pkm:checkFolder name='rps3' path="${OperationController.getPath('root.rps3.path')}"/> - - </li> - <li> - <pkm:checkFolder name='edit' display='Edit' - path="${OperationController.getPath('editBox.path')}"/> - </li> - </ul> - - </li> - - + </li> + <li><g:remoteLink controller="report" action="showFullCard" + update="logArea" + title="Selected records"> + <g:if test="${session['showFullCard'] == 'on'}"> + <b>full</b> + </g:if> + <g:else> + full + </g:else> + </g:remoteLink> + </li> + </ul> - <li> - Records per page - <ul> - <li> - <g:select name="resultType" - from="${[1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 40, 50, 100, 250]}" - style="direction: ltr; text-align: left; padding: 0; margin: 0; height: 24px;" - noSelection="${['null': '']}" - onchange="jQuery('#notificationArea').load('/nibras/generics/setPageMax/' + this.value);" - value="${Setting.findByNameLike('savedSearch.pagination.max.link')?.value ?: 4}"/> - <span id="notificationArea" style=""></span> - <span style="display: none" id="notificationAreaHidden"></span> + </li> - </li> - </ul> - </li> + <li> + Folders availability + <ul> + <li> + <pkm:checkFolder name='rps2' path="${OperationController.getPath('root.rps2.path')}"/> + </li> + <li> + <pkm:checkFolder name='rps3' path="${OperationController.getPath('root.rps3.path')}"/> + </li> + <li> + <pkm:checkFolder name='edit' display='Edit' + path="${OperationController.getPath('editBox.path')}"/> + </li> + </ul> + </li> + <li> + Records per page + <ul> + <li> + <g:select name="resultType" + from="${[1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 40, 50, 100, 250]}" + style="direction: ltr; text-align: left; padding: 0; margin: 0; height: 24px;" + noSelection="${['null': '']}" + onchange="jQuery('#notificationArea').load('/nibras/generics/setPageMax/' + this.value);" + value="${Setting.findByNameLike('savedSearch.pagination.max.link')?.value ?: 4}"/> + <span id="notificationArea" style=""></span> + <span style="display: none" id="notificationAreaHidden"></span> + + </li> + </ul> + </li> </ul> - <br/> - %{--<li>--}% - <b>Change repositories paths:</b> - <br/> - %{--<ul>--}% - %{--<li>--}% - rps1.path: <g:render template="/forms/updateSetting" model="[settingValue: 'root.rps1.path']"/> - <br/> - %{--</li>--}% + <br/> + %{--<li>--}% + <b>Change repositories paths:</b> + <br/> + %{--<ul>--}% + %{--<li>--}% + rps1.path: <g:render template="/forms/updateSetting" model="[settingValue: 'root.rps1.path']"/> + <br/> + %{--</li>--}% - %{--<li>--}% - rps2.path: <g:render template="/forms/updateSetting" model="[settingValue: 'root.rps2.path']"/> - %{--</li>--}% - %{--</ul>--}% + %{--<li>--}% + rps2.path: <g:render template="/forms/updateSetting" model="[settingValue: 'root.rps2.path']"/> + %{--</li>--}% + %{--</ul>--}% %{--</li>--}% - <br/> - </div> + <br/> + </div> - <h3 class="accordionPanelSettings"><a href="#"> - <g:message code="ui.parameters"></g:message> + <h3 class="accordionPanelSettings"><a href="#"> + <g:message code="ui.parameters"></g:message> - </a></h3> + </a></h3> - <div> - <g:if test="${1 == 2}"> - <g:each in="${[ - // ['app.parameters.Markup', 'Markup'], + <div> + <g:if test="${1 == 2}"> + <g:each in="${[ + // ['app.parameters.Markup', 'Markup'], // ['app.parameters.Pomegranate', 'Pomegranate'], - ['mcs.Department', 'Department'], - ['mcs.Course', 'Course'], 'l', + ['mcs.Department', 'Department'], + ['mcs.Course', 'Course'], 'l', - ['mcs.parameters.GoalType', 'Goal type'], - ['mcs.parameters.Context', 'Context'], - ['mcs.parameters.WorkStatus', 'Work status'], 'l', - ['mcs.parameters.PlannerType', 'Planner type'], - ['mcs.parameters.JournalType', 'Journal type'], 'l', + ['mcs.parameters.GoalType', 'Goal type'], + ['mcs.parameters.Context', 'Context'], + ['mcs.parameters.WorkStatus', 'Work status'], 'l', + ['mcs.parameters.PlannerType', 'Planner type'], + ['mcs.parameters.JournalType', 'Journal type'], 'l', // - ['mcs.parameters.ResourceStatus', 'Resource status'], - ['app.parameters.ResourceType', 'Resource type'], - 'l', - ['mcs.parameters.WritingStatus', 'Writing status'], - ['mcs.parameters.WritingType', 'Writing type'], - ['app.parameters.Blog', 'Blog'], - 'l', - ['app.Indicator', 'Indicator'], + ['mcs.parameters.ResourceStatus', 'Resource status'], + ['app.parameters.ResourceType', 'Resource type'], + 'l', + ['mcs.parameters.WritingStatus', 'Writing status'], + ['mcs.parameters.WritingType', 'Writing type'], + ['app.parameters.Blog', 'Blog'], + 'l', + ['app.Indicator', 'Indicator'], // ['mcs.parameters.Location', 'Location'], - ['app.PaymentCategory', 'Payment category'], - 'l', - ['mcs.parameters.RelationshipType', 'Relationship type'] - ]}" - var="i"> - <g:if test="${i != 'l'}"> - <g:render template="/layouts/manageParametersLink" model="[controller: i[0], name: i[1]]"/> - </g:if> - <g:else> - <hr/> - <br/> - </g:else> + ['app.PaymentCategory', 'Payment category'], + 'l', + ['mcs.parameters.RelationshipType', 'Relationship type'] + ]}" + var="i"> + <g:if test="${i != 'l'}"> + <g:render template="/layouts/manageParametersLink" model="[controller: i[0], name: i[1]]"/> + </g:if> + <g:else> + <hr/> + <br/> + </g:else> - </g:each> + </g:each> - <br/> - <hr/> - <br/> + <br/> + <hr/> + <br/> - <g:each in="${[ - ['app.parameters.CommandPrefix', 'Command prefix'], - ['mcs.parameters.SavedSearch', 'Saved search'], - ['cmn.Setting', 'Setting'], - ['app.Tag', 'Tag'] - ]}" var="i"> + <g:each in="${[ + ['app.parameters.CommandPrefix', 'Command prefix'], + ['mcs.parameters.SavedSearch', 'Saved search'], + ['cmn.Setting', 'Setting'], + ['app.Tag', 'Tag'] + ]}" var="i"> - <g:remoteLink controller="generics" action="fetchAddForm" - params="[entityController: i[0], isParameter: true, - updateRegion : 'centralArea']" - before="jQuery.address.value(jQuery(this).attr('href'));" - update="centralArea"> + <g:remoteLink controller="generics" action="fetchAddForm" + params="[entityController: i[0], isParameter: true, + updateRegion : 'centralArea']" + before="jQuery.address.value(jQuery(this).attr('href'));" + update="centralArea"> - <span style="font-size: 12px; padding: 2px;"> - ${i[1]} (${grailsApplication.classLoader.loadClass(i[0]).count()}) - </span> + <span style="font-size: 12px; padding: 2px;"> + ${i[1]} (${grailsApplication.classLoader.loadClass(i[0]).count()}) + </span> - </g:remoteLink> - <br/> - </g:each> + </g:remoteLink> + <br/> + </g:each> - </g:if> + </g:if> - <span style="-moz-column-count: 1; -webkit-column-count:1"> + <span style="-moz-column-count: 1; -webkit-column-count:1"> - <h4>Top level</h4> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.Department', name: 'Department']"/> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.Course', name: 'Course']"/> - <h4>For resources</h4> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.parameters.ResourceStatus', name: 'Resource status']"/> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'app.parameters.ResourceType', name: 'Resource type']"/> + <h4>Top level</h4> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.Department', name: 'Department']"/> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.Course', name: 'Course']"/> + <h4>For resources</h4> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.parameters.ResourceStatus', name: 'Resource status']"/> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'app.parameters.ResourceType', name: 'Resource type']"/> -<g:if test="${OperationController.getPath('goals.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <g:if test="${OperationController.getPath('goals.enabled')?.toLowerCase() == 'yes' ? true : false}"> <h4>For goals</h4> <g:render template="/layouts/manageParametersLink" model="[controller: 'mcs.parameters.GoalType', name: 'Goal type']"/> - </g:if> + </g:if> - <h4>For goals and tasks</h4> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.parameters.Context', name: 'Context']"/> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'mcs.parameters.WorkStatus', name: 'Work status']"/> -<g:if test="${OperationController.getPath('planner.enabled')?.toLowerCase() == 'yes' || OperationController.getPath('journal.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <h4>For goals and tasks</h4> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.parameters.Context', name: 'Context']"/> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'mcs.parameters.WorkStatus', name: 'Work status']"/> + <g:if test="${OperationController.getPath('planner.enabled')?.toLowerCase() == 'yes' || OperationController.getPath('journal.enabled')?.toLowerCase() == 'yes' ? true : false}"> <h4>For planner and journal</h4> <g:render template="/layouts/manageParametersLink" model="[controller: 'mcs.parameters.PlannerType', name: 'Planner type']"/> <g:render template="/layouts/manageParametersLink" model="[controller: 'mcs.parameters.JournalType', name: 'Journal type']"/> - </g:if> -<g:if test="${OperationController.getPath('writings.enabled')?.toLowerCase() == 'yes' ? true : false}"> + </g:if> + <g:if test="${OperationController.getPath('writings.enabled')?.toLowerCase() == 'yes' ? true : false}"> <h4>For writing</h4> <g:render template="/layouts/manageParametersLink" model="[controller: 'mcs.parameters.WritingType', name: 'Type']"/> <g:render template="/layouts/manageParametersLink" model="[controller: 'mcs.parameters.WritingStatus', name: 'Status']"/> - <g:render template="/layouts/manageParametersLink" + <g:render template="/layouts/manageParametersLink" model="[controller: 'app.parameters.Blog', name: 'Blog']"/> - </g:if> - %{--<g:render template="/layouts/manageParametersLink"--}% - %{--model="[controller: 'app.parameters.Blog', name: 'Blog']"/>--}% - <g:if test="${OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes' ? true : false}"> + </g:if> + %{--<g:render template="/layouts/manageParametersLink"--}% + %{--model="[controller: 'app.parameters.Blog', name: 'Blog']"/>--}% + <g:if test="${OperationController.getPath('indicators.enabled')?.toLowerCase() == 'yes' ? true : false}"> <h4>For indicators</h4> <g:render template="/layouts/manageParametersLink" model="[controller: 'app.Indicator', name: 'Indicator']"/> - </g:if> -<g:if test="${OperationController.getPath('payments.enabled')?.toLowerCase() == 'yes' ? true : false}"> + </g:if> + <g:if test="${OperationController.getPath('payments.enabled')?.toLowerCase() == 'yes' ? true : false}"> <h4>For payments</h4> <g:render template="/layouts/manageParametersLink" model="[controller: 'app.PaymentCategory', name: 'Payment category']"/> - %{--<g:render template="/layouts/manageParametersLink"--}% - %{--model="[controller: 'mcs.parameters.RelationshipType', name: 'Relationship type']"/>--}% - </g:if> - <h4>For any record</h4> - <g:render template="/layouts/manageParametersLink" - model="[controller: 'app.Tag', name: 'Tag']"/> + %{--<g:render template="/layouts/manageParametersLink"--}% + %{--model="[controller: 'mcs.parameters.RelationshipType', name: 'Relationship type']"/>--}% + </g:if> + <h4>For any record</h4> + <g:render template="/layouts/manageParametersLink" + model="[controller: 'app.Tag', name: 'Tag']"/> + </span> + <g:if test="${OperationController.getPath('pkm-actions.enabled')?.toLowerCase() == 'yes' ? true : false}"> + <g:remoteLink controller="page" action="colors" + update="centralArea" + title="List of colors to choose from"> + Colors + </g:remoteLink> - </span> - <g:if test="${OperationController.getPath('pkm-actions.enabled')?.toLowerCase() == 'yes' ? true : false}"> - <g:remoteLink controller="page" action="colors" - update="centralArea" - title="List of colors to choose from"> - Colors - </g:remoteLink> + <br/> - <br/> <h5 class=""> - <a>Exports</a> - </h5> + <h5 class=""> + <a>Exports</a> + </h5> - %{--<div>--}% + %{--<div>--}% - <g:remoteLink controller="operation" action="generateStaticBlogMenu" update="centralArea"> - Static blog menu - </g:remoteLink> - <br/> + <g:remoteLink controller="operation" action="generateStaticBlogMenu" update="centralArea"> + Static blog menu + </g:remoteLink> + <br/> - <g:remoteLink controller="export" action="textbooks2Bib" update="notificationArea"> - Textbooks 2 bib - </g:remoteLink> - <br/> + <g:remoteLink controller="export" action="textbooks2Bib" update="notificationArea"> + Textbooks 2 bib + </g:remoteLink> + <br/> - <g:remoteLink controller="export" action="generateAuthors" update="notificationArea"> - Generate authors db - </g:remoteLink> - <br/> + <g:remoteLink controller="export" action="generateAuthors" update="notificationArea"> + Generate authors db + </g:remoteLink> + <br/> - <g:remoteLink controller="export" action="staticWebsite" update="notificationArea"> - Generate static site - </g:remoteLink> - <br/> - <g:remoteLink controller="report" action="quranReportToString" update="centralArea"> - Qurani inline - </g:remoteLink> - <br/> <g:remoteLink controller="report" action="staticQuranReport" update="centralArea"> - Qurani inline to file - </g:remoteLink> - <br/> <g:remoteLink controller="report" action="staticQuranReportTex" update="centralArea"> - Qurani inline to Tex file - </g:remoteLink> - <br/> - <g:remoteLink controller="report" action="memorizationReport" update="centralArea"> - Memorization aid - </g:remoteLink> - <br/> <g:remoteLink controller="report" action="memorizationReport" update="centralArea"> - Memorization aid - </g:remoteLink> - <br/> - <g:remoteLink controller="report" action="staticMemorizationReport" update="centralArea"> - Memorization aid to file - </g:remoteLink> - <br/> + <g:remoteLink controller="export" action="staticWebsite" update="notificationArea"> + Generate static site + </g:remoteLink> + <br/> + <g:remoteLink controller="report" action="quranReportToString" update="centralArea"> + Qurani inline + </g:remoteLink> + <br/> <g:remoteLink controller="report" action="staticQuranReport" update="centralArea"> + Qurani inline to file + </g:remoteLink> + <br/> <g:remoteLink controller="report" action="staticQuranReportTex" update="centralArea"> + Qurani inline to Tex file + </g:remoteLink> + <br/> + <g:remoteLink controller="report" action="memorizationReport" update="centralArea"> + Memorization aid + </g:remoteLink> + <br/> <g:remoteLink controller="report" action="memorizationReport" update="centralArea"> + Memorization aid + </g:remoteLink> + <br/> + <g:remoteLink controller="report" action="staticMemorizationReport" update="centralArea"> + Memorization aid to file + </g:remoteLink> + <br/> - <g:remoteLink controller="report" action="matrixReport" update="centralArea"> - Salat matrix report - </g:remoteLink> - <br/> + <g:remoteLink controller="report" action="matrixReport" update="centralArea"> + Salat matrix report + </g:remoteLink> + <br/> - <g:remoteLink controller="export" action="generateAllBibs" update="notificationArea"> - Generate all bibs - </g:remoteLink> - <br/> + <g:remoteLink controller="export" action="generateAllBibs" update="notificationArea"> + Generate all bibs + </g:remoteLink> + <br/> - %{--<g:link controller="report" action="staticQuranReport"--}% - %{--target="_blank"--}% - %{--title="Qurani new tab">--}% - %{--Qurani new tab--}% - %{--</g:link>--}% - %{--<br/>--}% - <g:link controller="report" action="xcd2epub" - target="_blank" - title="xcd2epub"> - xcd 2epub - </g:link> - <br/> + %{--<g:link controller="report" action="staticQuranReport"--}% + %{--target="_blank"--}% + %{--title="Qurani new tab">--}% + %{--Qurani new tab--}% + %{--</g:link>--}% + %{--<br/>--}% + <g:link controller="report" action="xcd2epub" + target="_blank" + title="xcd2epub"> + xcd 2epub + </g:link> + <br/> - <g:remoteLink controller="generics" action="dotTextDump" update="notificationArea"> - Export records to text files - </g:remoteLink> + <g:remoteLink controller="generics" action="dotTextDump" update="notificationArea"> + Export records to text files + </g:remoteLink> - <br/> + <br/> - <g:remoteLink controller="export" action="exportTxtToBeamer" update="notificationArea"> - Convert text to beamer - </g:remoteLink> + <g:remoteLink controller="export" action="exportTxtToBeamer" update="notificationArea"> + Convert text to beamer + </g:remoteLink> - <br/> + <br/> - <a onclick="jQuery('#centralArea').load('report/duplicateIsbnBooks')">Books with duplication ISBN</a> - <br/> + <a onclick="jQuery('#centralArea').load('report/duplicateIsbnBooks')">Books with duplication ISBN</a> + <br/> - <h5 class=""> + <h5 class=""> - <a>Admin saved searches</a> - </h5> - <g:render template="/layouts/savedSearches" model="[entity: 'A']"/> - %{--</div>--}% - </g:if> - </div> - %{--</sec:ifAnyGranted>--}% - <br/> - <br/> - <br/> - <br/> - </div> + <a>Admin saved searches</a> + </h5> + <g:render template="/layouts/savedSearches" model="[entity: 'A']"/> + %{--</div>--}% + </g:if> + </div> + %{--</sec:ifAnyGranted>--}% + <br/> + <br/> + <br/> + <br/> +</div> <script type="text/javascript"> - jQuery("#addArticleFormNgs").relatedSelects({ onChangeLoad: '/nibras/generics/fetchCoursesForDepartment', defaultOptionText: '', diff --git a/grails-app/views/appMain/_north.gsp b/grails-app/views/appMain/_north.gsp index e6429e2..0a16d88 100644 --- a/grails-app/views/appMain/_north.gsp +++ b/grails-app/views/appMain/_north.gsp @@ -37,6 +37,13 @@ </g:if> + <td style="padding-right: 3px !important;"> + <a href="${createLink(controller: 'page', action:'appKanban')}" target="_blank"> + Kanban + ↗ + </a> + </td> + <td style="padding-right: 3px !important;"> @@ -346,7 +353,7 @@ %{--</sec:ifAnyGranted>--}% %{--</td>--}% - <td style="border: 0px dashed darkgray; padding-left: 15px !important;"> + <td style="border: 0px dashed darkgray; padding-left: 15px !important; padding-top: 0; padding-bottom: 0; background: #8e8e97"> <i style="color: #ebebeb;">Kanbans:</i> <g:render template="/layouts/savedSearchesLine" model="[entity: 'F']"/> @@ -406,14 +413,14 @@ %{--</a>--}% %{--</td>--}% - <td style="padding: 1px !important; margin-left: 9px; color: white;"> + %{--<td style="padding: 1px !important; margin-left: 9px; color: white;">--}% - <a href="http://khuta.org/nibras-doc/index.html" - style="" target="_blank"> + %{--<a href="http://khuta.org/nibras-doc/index.html"--}% + %{--style="" target="_blank">--}% %{-- <span style="color: white" class="ui-icon ui-icon-help"></span>--}% - <g:message code="ui.menu.help"></g:message> - </a> - </td> + %{--<g:message code="ui.menu.help"></g:message>--}% + %{--</a>--}% + %{--</td>--}% %{--<td>--}% %{--بالصفحة--}% diff --git a/grails-app/views/appMain/_regions.gsp b/grails-app/views/appMain/_regions.gsp index 6abf60a..aaf6cc1 100644 --- a/grails-app/views/appMain/_regions.gsp +++ b/grails-app/views/appMain/_regions.gsp @@ -15,8 +15,8 @@ </div> <div class="ui-layout-south footerRegion" - style="font-size: 11px; margin-top: 9px; min-height: 0px !important; padding: 3px; direction: ltr; text-align: left; font-family: tahoma; color: white"> - <g:render template="/appMain/south"/> + style="font-size: 12px; margin-top: 10px; min-height: 0px !important; padding: 3px; direction: ltr; text-align: left; font-family: tahoma; color: white"> + <g:render template="/appMain/south" model="[ips: ips]"/> </div> @@ -30,7 +30,7 @@ </div> - <div class="ui-layout-center appBkg" style="margin-top: 2px !important; margin-bottom: 2px !important;" + <div class="ui-layout-center appBkg" style="margin-top: 4px !important; margin-bottom: 4px !important;" onmouseover="jQuery('#hintArea').html('')"> %{--ToDo: display none?!--}% %{--<div class="ui-layout-content ui-widget-content" onmouseover="jQuery('#hintArea').html('')">--}% diff --git a/grails-app/views/appMain/_south.gsp b/grails-app/views/appMain/_south.gsp index 86de1b0..4aeda18 100644 --- a/grails-app/views/appMain/_south.gsp +++ b/grails-app/views/appMain/_south.gsp @@ -4,34 +4,59 @@ c.setFirstDayOfWeek(java.util.Calendar.MONDAY) %> <b>Week</b> ${c.get(Calendar.WEEK_OF_YEAR)} - | - + | + ${new Date().format("E dd MMM yyyy")} - | - + | + <b>${java.time.chrono.HijrahDate.now().format(java.time.format.DateTimeFormatter.ofPattern("dd MMMM yyyy"))}</b> - | - + | + <b>Repository 1</b>: ${ker.OperationController.getPath('root.rps1.path')} - | - - © khuta.org - | + | + + <b>Repository 2</b>: ${ker.OperationController.getPath('root.rps2.path')} + | + + 2020 © khuta.org -C*: <g:each in="${mcs.Department.findAll([sort: 'orderNumber', order: 'asc'])}" var="d"> + | + + +<span id="onlineLog"></span> + + + / IPs: +<g:each in="${ips}" var="ip"> + + <b title="${ip.title}"> ${ip.ip}</b> (${ip.name}) + +</g:each> + +<g:if test="${1==2}"> +<span style="border: 0px dashed darkgray; padding-left: 15px !important; background: #8e8e97"> + +${mcs.Course.countByBookmarked(true)} C * / p4: + +: <g:each in="${mcs.Department.findAll([sort: 'orderNumber', order: 'asc'])}" var="d"> <g:if test="${mcs.Course.countByDepartmentAndBookmarked(d, true, [sort: 'code', order: 'asc']) > 0}"> - <b style="font-size: 14px;">${d.code}</b>: + %{--<b style="font-size: 14px;">${d.code}</b>:--}% <g:each in="${mcs.Course.findAllByDepartmentAndBookmarked(d,true, [sort: 'department', order: 'asc'])}" var="crs"> - <span style="font-size: 13px; border-radius: 2px; border: 1px lightgrey solid; padding: 1px; margin-right: 2px;">${crs.code}</span> + <g:if test="${crs.priority == 4}"> + <span style="font-size: 13px; text-decoration: underline; border-radius: 2px; padding: 1px; margin-right: 4px;">${crs.code}</span> + </g:if> </g:each> </g:if> </g:each> +</span> + +</g:if> %{-- ${java.time.chrono.HijrahDate.now().get(java.time.temporal.ChronoField.DAY_OF_MONTH)}/--}% diff --git a/grails-app/views/appMain/_west.gsp b/grails-app/views/appMain/_west.gsp index b651e5a..7908e3d 100644 --- a/grails-app/views/appMain/_west.gsp +++ b/grails-app/views/appMain/_west.gsp @@ -460,8 +460,7 @@ Order: <g:select name="order" from="${['Asc', 'Desc']}"/> - <br/> - Max: + Max: <g:select name="max" value="3" from="${['1', '3', '5', '10', '20', '50', '100', '500']}"/> <br/> diff --git a/grails-app/views/appMain/main.gsp b/grails-app/views/appMain/main.gsp index a8138bc..0ce82f7 100644 --- a/grails-app/views/appMain/main.gsp +++ b/grails-app/views/appMain/main.gsp @@ -305,7 +305,7 @@ $("#accordionCenter").accordion({ jQuery.idleTimeout('#idletimeout', '#idletimeout a', { - idleAfter: 10, + idleAfter: 1, pollingInterval: 10, keepAliveURL: '/nibras/page/heartbeat', serverResponseEquals: 'ok', @@ -315,11 +315,12 @@ $("#accordionCenter").accordion({ url: '/nibras/page/heartbeat', dataType: 'html', success: function(html, textStatus) { -// jQuery('body').append(html); + jQuery('#onlineLog').html('Online'); // console.log('resp idle: ' + html) }, error: function(xhr, textStatus, errorThrown) { + jQuery('#onlineLog').html('OFFLINE'); confirm('Session lost!') // confirm('An error occurred! ' + ( errorThrown ? errorThrown : xhr.status )); // alert('An error occurred! ' + ( errorThrown ? errorThrown : xhr.status )); @@ -334,10 +335,12 @@ $("#accordionCenter").accordion({ dataType: 'html', success: function(html, textStatus) { // jQuery('body').append(html); + jQuery('#onlineLog').html('Online'); // console.log('resp timeout: ' + html) }, error: function(xhr, textStatus, errorThrown) { confirm('Session timeout!') + jQuery('#onlineLog').html('OFFLINE'); // alert('An error occurred! ' + ( errorThrown ? errorThrown : xhr.status )); } }); @@ -500,6 +503,13 @@ $("#accordionCenter").accordion({ jQuery('#quickAddTextField').removeClass('shiftEnterPressed') } + + function openNoteTaker() { + window.open('/nibras/page/appDaftar', '', + 'height=200,width=400,chrome=yes,scrollbars=yes, titlebar=no, toolbar=no, menubar=no, location=no, status=no, directories=no, resizable=yes'); + + } + // Mousetrap.bindGlobal('f2', function (e) { // jQuery('#quickAddXcdSubmit').click(); // jQuery('#addXcdFormDaftarSubmit').click(); @@ -553,7 +563,7 @@ $("#accordionCenter").accordion({ <body> -<g:render template="/appMain/regions" model="[htmlContent: htmlContent]"/> +<g:render template="/appMain/regions" model="[htmlContent: htmlContent, ips: ips]"/> <div id="idletimeout"></div> diff --git a/grails-app/views/gTemplates/_box.gsp b/grails-app/views/gTemplates/_box.gsp index c7a75ac..90c2091 100644 --- a/grails-app/views/gTemplates/_box.gsp +++ b/grails-app/views/gTemplates/_box.gsp @@ -1,7 +1,8 @@ <%@ page import="ker.OperationController; java.text.DecimalFormat; mcs.Goal; org.apache.commons.lang.StringUtils; mcs.Writing; mcs.Task; mcs.Planner" %> -<div style="margin-bottom: 3px; margin-top: 3px; max-width: 95%; direction: rtl; text-align: right;" class="text${record.language} "> +<div style="margin-bottom: 3px; margin-top: 3px; max-width: 95%; direction: rtl; text-align: right;" + class="text${record.language} "> <g:if test="${record}"> <table width="99%;" border="0" class="text${record.language}" @@ -9,19 +10,22 @@ %{--<!--Id: ${plannerInstance.id} -->--}% - <tr style="background: #f1f1eb; border:0.5px solid #cccccc; padding: 0px;" class="${'GTP'.contains(record.entityCode()) ? 'workStatus-' + record.status?.code : ''}"> + <tr style="background: #f1f1eb; border:0.5px solid #cccccc; padding: 0px;" + class="${'GTP'.contains(record.entityCode()) ? 'workStatus-' + record.status?.code : ''}"> - <td style="font-size: 0.9em; padding: 3px; line-height: 1.1em;" class="text${record.class.declaredFields.name.contains('language') ? record.language : (entityCode == 'E' ? record?.book?.language : '')};"> + <td style="font-size: 0.9em; padding: 3px; line-height: 1.1em;" + class="text${record.class.declaredFields.name.contains('language') ? record.language : (entityCode == 'E' ? record?.book?.language : '')};"> <div class="" style="color: darkgray; display: inline; margin: 2px !important; "> - <g:remoteLink controller="generics" action="showSummary" update="underBox${record.entityCode()}${record.id}" - params="${[id: record.id, entityCode: record.entityCode(), mobileView: mobileView]}" + <g:remoteLink controller="generics" action="showSummary" + update="underBox${record.entityCode()}${record.id}" + params="${[id: record.id, entityCode: record.entityCode(), mobileView: mobileView]}" style="color: darkgray;"> ${record.entityCode()} </g:remoteLink> </div> - %{--<sup>${record.priority}</sup>--}% + %{--<sup>${record.priority}</sup>--}% <g:if test="${'RE'.contains(record.entityCode())}"> <sup>${record.orderInCourse}</sup> @@ -36,7 +40,7 @@ <g:elseif test="${record.priority == 4}"> <b>>></b> </g:elseif> - <g:elseif test="${record.priority == 5}"> + <g:elseif test="${record.priority == 5}"> <b>>>></b> </g:elseif> <g:elseif test="${record.priority == 1}"> @@ -94,56 +98,58 @@ <span style="color: #003399;"> - <g:if test="${'G'.contains(record.entityCode())}"> - <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> - </g:if> - <g:if test="${'T'.contains(record.entityCode())}"> - <i style="font-size: small">${record?.context?.code} ${record?.course?.code} ${record.department?.code}</i> - <sup>${record.plannedDuration ? record.plannedDuration + "''" : ''}</sup> - </g:if> - <g:if test="${'P'.contains(record.entityCode())}"> - <i style="font-size: small">${record?.type?.code} ${record.status?.code}</i> - </g:if> - <g:if test="${'J'.contains(record.entityCode())}"> - <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> - </g:if> - <g:if test="${'W'.contains(record.entityCode())}"> + <g:if test="${'G'.contains(record.entityCode())}"> + <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> + </g:if> + <g:if test="${'T'.contains(record.entityCode())}"> + <i style="font-size: small">${record?.context?.code} ${record?.course?.code} ${record.department?.code}</i> + <sup>${record.plannedDuration ? record.plannedDuration + "''" : ''}</sup> + </g:if> + <g:if test="${'P'.contains(record.entityCode())}"> + <i style="font-size: small">${record?.type?.code} ${record.status?.code}</i> + </g:if> + <g:if test="${'J'.contains(record.entityCode())}"> + <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> + </g:if> + <g:if test="${'W'.contains(record.entityCode())}"> - <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> - </g:if> - <g:if test="${'E'.contains(record.entityCode())}"> - <i style="font-size: small"> - B-${record?.book?.id} - ${record?.book?.author}, - ${record?.book?.title ?: record?.book?.legacyTitle} ${record?.book?.edition} - (${record?.book?.publisher}, - ${record?.book?.publicationDate}) - </i> - - <i style="font-size: small">${record.class.declaredFields.name.contains('type') ? record?.type?.code: ''} ${record.class.declaredFields.name.contains('department') ? record.department?.code: ''}</i> - </g:if> - </span> + <i style="font-size: small">${record?.type?.code} ${record.department?.code}</i> + </g:if> + <g:if test="${'E'.contains(record.entityCode())}"> + <i style="font-size: small"> + B-${record?.book?.id} + ${record?.book?.author}, + ${record?.book?.title ?: record?.book?.legacyTitle} ${record?.book?.edition} + (${record?.book?.publisher}, + ${record?.book?.publicationDate}) + </i> + + <i style="font-size: small">${record.class.declaredFields.name.contains('type') ? record?.type?.code : ''} ${record.class.declaredFields.name.contains('department') ? record.department?.code : ''}</i> + </g:if> + </span> - <g:remoteLink controller="generics" action="showSummary" update="underBox${record.entityCode()}${record.id}" + <g:remoteLink controller="generics" action="showSummary" + update="underBox${record.entityCode()}${record.id}" style="font-family: tahoma; font-size: 0.9em;" class="text${record.class.declaredFields.name.contains('language') ? record.language : (entityCode == 'E' ? record?.book?.language : '')};" - params="${[id: record.id, entityCode: record.entityCode(), mobileView: mobileView]}" > - + params="${[id: record.id, entityCode: record.entityCode(), mobileView: mobileView]}"> - <span style="" class="text${record.class.declaredFields.name.contains('language') ? record.language : (entityCode == 'E' ? record?.book?.language : '')};"> + <span style="" + class="text${record.class.declaredFields.name.contains('language') ? record.language : (entityCode == 'E' ? record?.book?.language : '')};"> <g:if test="${'P'.contains(record.entityCode()) && record.task}"> - <span title="${record?.summary}">${record.task?.summary}</span> + <br/> <span title="${record?.summary}">${record.task?.summary}</span> </g:if> <g:elseif test="${'N'.contains(record.entityCode())}"> ${record?.orderInWriting ? '#' + record?.orderInWriting + ' ' : ''} - ${record?.summary} + <br/> ${record?.summary} <g:if test="${record.fileName}"> - <a href="${createLink(controller: 'operation', action: 'downloadNoteFile', id: record.id)}" target="_blank"> + <a href="${createLink(controller: 'operation', action: 'downloadNoteFile', id: record.id)}" + target="_blank"> <span style="font-size: 12px;"> ${record.fileName} </span></a> @@ -151,20 +157,21 @@ </g:elseif> <g:elseif test="${'R'.contains(record.entityCode())}"> - + <br/> ${record?.title ?: record?.legacyTitle} <i>${record?.author}</i> </g:elseif> <g:elseif test="${'E'.contains(record.entityCode())}"> - + <br/> <span style="color: gray">${record?.book?.title ?: record?.book?.legacyTitle}</span> <u>${record.chapters}</u> <i>${record?.summary}</i> </g:elseif> <g:else> + <br/> ${record?.summary} </g:else> @@ -191,45 +198,45 @@ </div> </g:if> - </td> - </tr> - <tr style="background: #fff; border-left: 0px; border-right: 0px; border-bottom: 1px #ccc !important; "> - <td class="text${record.language}" style="padding: 3px; border: 1px darkgray dashed;"> - + </tr> + <tr style="background: #fff; border-left: 0px; border-right: 0px; border-bottom: 1px #ccc !important; display: none;" > + <td class="text${record.language}" style="padding: 3px; border: 1px darkgray dashed;"> - <span style="color: dimgray">${record.class.declaredFields.name.contains('description') && record.description? StringUtils.abbreviate(record.description?.encodeAsHTML(), 240): ''}</span> + <span style="color: dimgray"> + ${record.class.declaredFields.name.contains('description') && record.description ? StringUtils.abbreviate(record.description?.encodeAsHTML(), 240) : ''} + </span> - <g:if test="${record.entityCode() == 'N' && record.recordId}"> + <g:if test="${record.entityCode() == 'N' && record.recordId}"> - <g:remoteLink controller="generics" action="showSummary" - id="${record.recordId}" - params="[entityCode: record.entityCode]" - update="belowNRecord${record.id}" - title="Show parent entity"> + <g:remoteLink controller="generics" action="showSummary" + id="${record.recordId}" + params="[entityCode: record.entityCode]" + update="belowNRecord${record.id}" + title="Show parent entity"> - <b>${record.entityCode}</b> - <i>${record.recordId}</i> + <b>${record.entityCode}</b> + <i>${record.recordId}</i> - <g:if test="${record.entityCode == 'R'}"> - ${Book.get(record.recordId)} - </g:if> + <g:if test="${record.entityCode == 'R'}"> + ${Book.get(record.recordId)} + </g:if> - </g:remoteLink> + </g:remoteLink> - </g:if> + </g:if> </td> </tr> %{--<g:if test="${'CGR'.contains(record.entityCode()) && record.percentCompleted}">--}% %{--<tr>--}% - %{--<td colspan="2" style="padding: 0; margin: 0" class="text${record.language}">--}% - %{--<br/>--}% - %{--<pkm:progressBar percent="${record.percentCompleted}"/>--}% + %{--<td colspan="2" style="padding: 0; margin: 0" class="text${record.language}">--}% + %{--<br/>--}% + %{--<pkm:progressBar percent="${record.percentCompleted}"/>--}% - %{--</td>--}% + %{--</td>--}% %{--</tr>--}% %{--</g:if>--}% </table> @@ -238,6 +245,11 @@ <br/> + <p style="page-break-before: always"></p> -<div id="underBox${record.entityCode()}${record.id}"></div> \ No newline at end of file +<div id="underBox${record.entityCode()}${record.id}"></div> + +<div style="margin-left: 20px;" id="below${record.entityCode()}Record${record.id}"> + +</div> \ No newline at end of file diff --git a/grails-app/views/gTemplates/_recordJP.gsp b/grails-app/views/gTemplates/_recordJP.gsp index 2358fb5..fffb1f5 100644 --- a/grails-app/views/gTemplates/_recordJP.gsp +++ b/grails-app/views/gTemplates/_recordJP.gsp @@ -3,7 +3,7 @@ value="${record.metaClass.respondsTo(record, 'entityCode') ? record.entityCode() : record.class?.name?.split(/\./).last()}"/> -<div class="recordDetailsBody" style="margin-left: 5px;" id="detailsRegion${entityCode}${record.id}"> +<div class="recordDetailsBody" style="margin: 5px;" id="detailsRegion${entityCode}${record.id}"> <g:if test="${'CTGREW'.contains(entityCode)}"> @@ -15,18 +15,22 @@ %{--<g:select name="type" from="['J', 'P']" value="P"/>--}% <g:hiddenField name="type" value="P"/> - <g:select name="level" from="['l', 'e', 'y', 'A', 'M', 'r', 'w', 'd', 'm']" value="m"/> - <g:select name="priority" from="${1..4}" value="3" title="priority"/> - <g:select name="type.id" + l<g:select name="level" from="['l', 'e', 'y', 'A', 'M', 'r', 'w', 'd', 'm']" value="m"/> + p<g:select name="priority" from="${1..4}" value="3" title="priority"/> + #<g:select name="type.id" from="${mcs.parameters.PlannerType.list([sort: 'code'])}" value="${mcs.parameters.PlannerType.findByCode('assign').id}" optionKey="id" optionValue="code" title="Type"/> - <input type="text" name="date" title="Format: wwd [hh]" placeholder="Date" + (<input type="text" name="date" title="Format: wwd [hh]" placeholder="Date" style="width: 70px;" value="${mcs.UtilsController.toWeekDate(new Date() + 1)}_15"/> + ) <input type="text" name="endDate" title="Format: wwd [hh]" placeholder="End date" + style="width: 70px;" + value="${mcs.UtilsController.toWeekDate(new Date())}_${new Date().format('HH').toInteger() + 1}"/> + <input type="text" name="summary" title="" placeholder="Summary" - style="width: 500px;" + style="width: 300px;" value=""/> @@ -45,17 +49,24 @@ %{--<g:select name="type" from="['J', 'P']" value="J"/>--}% <g:hiddenField name="type" value="J"/> - <g:select name="level" from="['l', 'e', 'y', 'M', 'r', 'w', 'd', 'm']" value="m"/> - <g:select name="priority" from="${1..4}" value="3" title="priority"/> - <g:select name="type.id" from="${mcs.parameters.JournalType.list([sort: 'code'])}" - value="${JournalType.findByCode('rev').id}" + l <g:select name="level" from="['l', 'e', 'y', 'M', 'r', 'w', 'd', 'm']" value="m"/> + p <g:select name="priority" from="${1..4}" value="3" title="priority"/> + #<g:select name="type.id" from="${mcs.parameters.JournalType.list([sort: 'code'])}" + value="${JournalType.findByCode('act').id}" optionKey="id" optionValue="code" title="Type"/> - <input type="text" name="date" title="Format: wwd [hh]" placeholder="Date" + (<input type="text" name="date" title="Format: wwd [hh]" placeholder="Date" style="width: 70px;" - value="${mcs.UtilsController.toWeekDate(new Date() -1)}_15"/> + value="${mcs.UtilsController.toWeekDate(new Date())}_${new Date().format('HH')}"/> + + + ) <input type="text" name="endDate" title="Format: wwd [hh]" placeholder="End date" + style="width: 70px;" + value="${mcs.UtilsController.toWeekDate(new Date())}_${new Date().format('HH').toInteger() + 1}"/> + + <input type="text" name="summary" title="" placeholder="Summary" - style="width: 500px;" + style="width: 300px;" value=""/> diff --git a/grails-app/views/gTemplates/_recordSummary.gsp b/grails-app/views/gTemplates/_recordSummary.gsp index 1358c83..408ab6f 100644 --- a/grails-app/views/gTemplates/_recordSummary.gsp +++ b/grails-app/views/gTemplates/_recordSummary.gsp @@ -25,7 +25,7 @@ <div id="${entityCode}Record${record.id}" style=""> - + <a onclick="jQuery('#${entityCode}Record${record.id}').html('');" style="float: right; color: darkgray; margin-right: 4px;">x</a> %{--${justUpdated ? 'justUpdated' : ''} todo--}% <div class="recordContainer" @@ -75,8 +75,8 @@ title="ID ${record.id}. Click to refresh"> <span class="${entityCode}-bkg ID-bkg ${entityCode == 'N' && record.entityCode != null ? 'non-genuineNote' : ''} ${entityCode == 'T' && record.isTodo ? 'todoTask' : ''}" - style="padding: 3px; margin-right: 3px; color: gray;"> - <b style="color: white;">${entityCode} </b> + style="padding: 3px; margin-right: 3px; color: gray; display: inline;"> + <span style="color: lightgray;">${entityCode}</span><b><span style="color: white;">${record.id}</span></b> </span> </g:remoteLink> diff --git a/grails-app/views/gTemplates/_searchForm.gsp b/grails-app/views/gTemplates/_searchForm.gsp index e01c607..a183bb8 100644 --- a/grails-app/views/gTemplates/_searchForm.gsp +++ b/grails-app/views/gTemplates/_searchForm.gsp @@ -37,7 +37,7 @@ and <g:textField name="dateB" style="width: 50px;" value=""/> <br/> -<g:if test="${'GTPJWNR'.contains(entityCode)}"> +<g:if test="${'GPJWNR'.contains(entityCode)}"> <g:select name="type" style="width: 150px;" from="${types}" optionKey="id" optionValue="value" diff --git a/grails-app/views/layouts/_panel.gsp b/grails-app/views/layouts/_panel.gsp index 9884542..f7acc1c 100644 --- a/grails-app/views/layouts/_panel.gsp +++ b/grails-app/views/layouts/_panel.gsp @@ -1114,7 +1114,7 @@ Authors: ${authors} </div> </g:if> -<g:if test="${entityCode == 'N' && record.version == 0}"> +<g:if test="${entityCode == 'N'}"> Convert to <g:each in="${['J', 'P', 'T', 'R', 'W']}" var="t"> diff --git a/grails-app/views/page/kanbanCrs.gsp b/grails-app/views/page/kanbanCrs.gsp index 19871e4..d60c186 100644 --- a/grails-app/views/page/kanbanCrs.gsp +++ b/grails-app/views/page/kanbanCrs.gsp @@ -20,7 +20,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - %{--<meta name="layout" content="main"/>--}% + <meta name="layout" content="main"/> <title>${title ?: 'Kanban'}</title> @@ -40,7 +40,7 @@ %{--<r:require modules="jquery-ui"/>--}% - <r:layoutResources/> + <link rel="stylesheet" href="${resource(dir: 'css', file: 'jquery-ui-1.8.22.custom.css')}"/> @@ -104,71 +104,8 @@ <script type=text/javascript> - /** - * UI Layout Callback: resizePaneAccordions - * - * This callback is used when a layout-pane contains 1 or more accordions - * - whether the accordion a child of the pane or is nested within other elements - * Assign this callback to the pane.onresize event: - * - * SAMPLE: - * < jQuery UI 1.9: $("#elem").tabs({ show: $.layout.callbacks.resizePaneAccordions }); - * > jQuery UI 1.9: $("#elem").tabs({ activate: $.layout.callbacks.resizePaneAccordions }); - * $("body").layout({ center__onresize: $.layout.callbacks.resizePaneAccordions }); - * - * Version: 1.2 - 2013-01-12 - * Author: Kevin Dalman (kevin.dalman@gmail.com) - */ - ; - (function ($) { - var _ = $.layout; - -// make sure the callbacks branch exists - if (!_.callbacks) _.callbacks = {}; - - _.callbacks.resizePaneAccordions = function (x, ui) { - // may be called EITHER from layout-pane.onresize OR tabs.show - var $P = ui.jquery ? ui : $(ui.newPanel || ui.panel); - // find all VISIBLE accordions inside this pane and resize them - $P.find(".ui-accordion:visible").each(function () { - var $E = $(this); - if ($E.data("accordion")) // jQuery < 1.9 - $E.accordion("resize"); - if ($E.data("ui-accordion")) // jQuery >= 1.9 - $E.accordion("refresh"); - }); - }; - })(jQuery); - - jQuery(document).ready(function () { - var myLayout = $('body').layout({ - west__size: 310, - east__size: 430, - // RESIZE Accordion widget when panes resize - west__onresize: $.layout.callbacks.resizePaneAccordions, - east__onresize: $.layout.callbacks.resizePaneAccordions, - onresize: $.layout.callbacks.resizePaneAccordions, - north__closable: true, - south__closable: true, - north__spacing_closed: 5 // big resizer-bar when open (zero height) - , north__resizable: false // OVERRIDE the pane-default of 'resizable=true' - , south__resizable: false // OVERRIDE the pane-default of 'resizable=true' - , south__spacing_open: 5 // no resizer-bar when open (zero height) - , south__spacing_closed: 5 // big resizer-bar when open (zero height) - - , east__spacing_open: 5 // no resizer-bar when open (zero height) - , east__spacing_closed: 5 // big resizer-bar when open (zero height) - , west__spacing_open: 5 // no resizer-bar when open (zero height) - , west__spacing_closed: 5 // big resizer-bar when open (zero height) -// , west__initClosed: true - , west__slideTrigger_open: 'mouseover' - - - }); - - }); </script> @@ -192,13 +129,12 @@ %{--</tr>--}% %{--</table>--}% %{--<center>--}% -<r:layoutResources/> -<div class="ui-layout-north southRegion appBkg" style="overflow: hidden;" - style=""> +%{--<div class="ui-layout-north southRegion appBkg" style="overflow: hidden;"--}% + %{--style="">--}% -</div> +%{--</div>--}% %{--<div class="ui-layout-west westRegion appBkg" style="margin-top: 5px !important;margin-bottom: 5px !important;">--}% %{--<div class="ui-layout-content ui-widget-content">--}% @@ -207,25 +143,29 @@ %{--</div>--}% %{--</div>--}% -<div class="ui-layout-south southRegion" style="direction: rtl; text-align: center; font-family: tahoma; padding-bottom: 4px;"> +%{--<div class="ui-layout-south southRegion" style="direction: rtl; text-align: center; font-family: tahoma; padding-bottom: 4px;">--}% -</div> +%{--</div>--}% -<div class="ui-layout-east eastRegion appBkg" style="margin-top: 5px !important;margin-bottom: 5px !important;"> +%{--<div class="ui-layout-east eastRegion appBkg" style="margin-top: 5px !important;margin-bottom: 5px !important;">--}% - <div class="ui-layout-content ui-widget-content"> - <div id="3rdPanel" ></div> - </div> -</div> + %{--<div class="ui-layout-content ui-widget-content">--}% + %{--<div id="3rdPanel" ></div>--}% + %{--</div>--}% +%{--</div>--}% -<div class="ui-layout-center appBkg" style="margin-top: 5px !important; margin-bottom: 5px !important; "> +<div class="ui-layout-center appBkg" style="margin-top: 40px !important; margin-bottom: 5px !important; "> %{--ToDo: display none?!--}% <div class="ui-layout-content ui-widget-content" onmouseover="jQuery('#hintArea').html('')"> <div id="notificationArea"></div> - <g:if test="${ssId}"> + <g:if test="${items}"> + <g:render template="/reports/dynamicKanbanTable" + model="[items: items, groups: groups, groupBy: groupBy, title:title, ssId: ssId]"/> + </g:if> + <g:elseif test="${ssId}"> <g:render template="/gTemplates/recordListing" model="[ ssId: ssId, searchResultsTotal: searchResultsTotal, @@ -233,17 +173,13 @@ box: 1, list: list, title: title]"/> - </g:if> + </g:elseif> <g:elseif test="${list}"> <g:render template="/gTemplates/recordListing" model="[ totalHits: totalHits, list: list, title: title]"/> </g:elseif> - <g:elseif test="${items}"> - <g:render template="/reports/dynamicKanbanTable" - model="[items: items, groups: groups, groupBy: groupBy, title:title, ssId: ssId]"/> - </g:elseif> <g:else> <g:render template="/reports/kanbanCrs" model="[title: title]"/> </g:else> @@ -254,6 +190,6 @@ </div> </body> -%{--<r:layoutResources/>--}% +<r:layoutResources/> </html> diff --git a/run.bat b/run.bat index 64ddfc6..f5f8151 100644 --- a/run.bat +++ b/run.bat @@ -4,4 +4,5 @@ set GRAILS_HOME=D:\dev\grails-3.3.10 set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_111 set CATALINA=-server -Xmx780m -grails -disable.auto.recompile=false -Dgrails.gsp.enable.reload=true run-app \ No newline at end of file +grails -disable.auto.recompile=false -Dgrails.gsp.enable.reload=true run-app +pause diff --git a/src/main/resources/public/css/jquery-ui-1.8.22.custom.css b/src/main/resources/public/css/jquery-ui-1.8.22.custom.css index c06358f..54362cd 100644 --- a/src/main/resources/public/css/jquery-ui-1.8.22.custom.css +++ b/src/main/resources/public/css/jquery-ui-1.8.22.custom.css @@ -155,7 +155,7 @@ border: 1px solid #a3a3a3; /*background: #c1c1c1 url(images/ui-bg_highlight-hard_30_7e6f8b_1x100.png) 50% 50% repeat-x;*/ font-weight: normal; - color: #ffffff; + /*color: #111;*/ } .ui-state-hover a, .ui-state-hover { diff --git a/src/main/resources/public/css/main-kanban.css b/src/main/resources/public/css/main-kanban.css new file mode 100644 index 0000000..aaa0e74 --- /dev/null +++ b/src/main/resources/public/css/main-kanban.css @@ -0,0 +1,2009 @@ +html { + /*background: #f1f1f1;*/ + font-family: Lato !important; +} + +.ID-bkg { + background: #808080; + padding: 4px; + margin: 2px; +} + +#authBody { + background: url(../images/loginpageBackground.jpg) center left no-repeat; + height: 90% !important; + + width: 99%; + margin: 0; + padding: 0; +} + +html * { + margin: 0px; + font-family: Lato !important; + /*padding: 0; SELECT NOT DISPLAYED CORRECTLY IN FIREFOX */ +} + +/* GENERAL */ + +#spinner2 { + position: fixed; + top: 50%; + left: 50%; + margin-left: -100px; + /*half width of the spinner gif */ + margin-top: -100px; + /*half height of the spinner gif */ + text-align: center; + z-index: 1200034; + overflow: auto; + width: 200px; /* width of the spinner gif */ + height: 200px; /*hight of the spinner gif +2px to fix IE8 issue */ +} + +.appBkg { + /*background: #e0e0e0 !important;*/ + /*background: #fdfdfd !important;*/ +} + +.ui-layout-resizer { + /*background: lightgrey !important;*/ + /*background: #fdfdfd !important;*/ + z-index: 200000 !important; + padding: 1px; + border-radius: 2px; +} + +.ui-layout-toggler-east{ + /*background: darkgray !important;*/ +} + +.ui-layout-resizer-north{ + display: none !important; +} +.ui-layout-resizer-south{ + display: none !important; +} + +.ui-layout-center, /* has content-div */ + +.ui-layout-south, /* has content-div ... */ + .ui-layout-content, + .ui-layout-content { + /*background: #fdfdfd;*/ + +} + + +.ui-layout-west, /* has Accordion */ +.ui-layout-east{ + /*background: #9FA19E !important;*/ +} +.ui-layout-north { + border-bottom-left-radius: 3px !important; + border-bottom-right-radius: 3px !important; +} +.ui-layout-south { + border-top-left-radius: 3px !important; + border-top-right-radius: 3px !important; +} +.ui-layout-south, .ui-layout-north { + border: solid 0.5px #818284; + + background: #6D6D74 !important; +/*url(../images/bg-header.gif) no-repeat*/ +} + +body { + /*background: #fdfdfd;*/ + color: #333; + /*line-height: 1.4;*/ + font-size: 1em; + font-family: Lato !important; + + background: #D8D4C9 url(../images/bg-main.gif) repeat-x; + /*font: 12px/20px Verdana, Arial, Tahoma, sans-serif;*/ + + /*todo*/ + padding-left: 2% !important; + padding-right: 2% !important; + + /*'Lucida Sans Unicode';*/ + /*overflow: hidden;*/ + /*margin: 2px;*/ + /*padding: 2px;*/ + + /*float: left;*/ + /*margin: 0 15px 10px 15px;*/ + /*margin: auto;*/ + /*width: 90%;*/ +} + +a:link, a:visited { + /*color: #333333;*/ + text-decoration: none; + /*font-weight: normal;*/ + cursor: pointer; + /*font-size: 12px;*/ + /*font-family: verdana;*/ +} + +/*.banner a:hover {*/ +/*color: #ffc55c !important;*/ +/*}*/ + +.multiselect { + width: 650px; + height: 200px; +} + +h1 { + color: #4e5f6e; + font-weight: bold; + text-decoration: underline; + font-size: 14px; + margin: .4em 0 .3em 0; + padding: 4px; + /*font-family: arial;*/ + /*"DejaVu Sans Mono";*/ +} + +h2 { + font-family: Lato, arial; + font-size: 14px; + color: #144a6c; + font-weight: bold; + /*line-height: 15px;*/ + margin: 5px; + padding: 5px; + +} + +h2:hover { + /* background: #daebf9; changed*/ + +} + +h3 { + font-family: Lato, arial; + font-size: 13px; + color: #799edd; + font-weight: bold; + line-height: 15px; + margin: 5px; +} + +h4 { + + color: #212121; + /*4e5f6e;*/ + font-weight: bold; + font-size: 15px; + /*margin: .2em 0 .2em 0;*/ + padding: 5px; + /*margin-left: 1em;*/ + font-family: Lato, "DejaVu Sans Mono"; + + /*padding: 4px;*/ + /*vertical-align: top;*/ + /*background: #648497;*/ + /*font-weight: bold;*/ + /*color: white;*/ + + /*font-weight: bold;*/ + /*font-size: 13px;*/ + /*margin: .8em 0 .3em 0;*/ + /*padding: 6px;*/ + /*margin-left: 1.3em;*/ + /*font-family: "DejaVu Sans Mono";*/ +} + +ul { + padding-left: 13px; +} + +.accordion ul li { + line-height: 14px; +} + +input, select, textarea { + background-color: #fcfcfc; + border: 1px solid #ccc; + font: 11px lato, tahoma, verdana, arial, helvetica, sans-serif; + margin: 1px 0; + padding: 2px 2px; + min-width: 20px !important; + border-radius: 2px !important; + text-align: start !important; + unicode-bidi: plaintext !important; + height: 25px; +} + +select, textarea { + text-align: left; +} + +select { + max-width: 150px; +} + +table { + border-radius: 3px !important; + +} + +/*TODO: join the three below */ + +.dialog select { + /*width: 300px;*/ +} + +.dialog textarea { + width: 200px; + height: 30px; +} + +.dialog input { + width: 200px; +} + +.longInput { + width: 200px !important; +} + +.mediumInput { + width: 100px !important; +} + +.shortInput { + width: 50px !important; +} + +select { + padding: 2px 2px 2px 0; +} + +textarea { + width: 200px; + height: 60px; + vertical-align: top; +} + +/*select:focus,*/ +input:focus, textarea:focus { + border: 1px solid #9c9c9c; + /*background: #f1f3f5;*/ +} + +/* NAVIGATION MENU */ + +.nav { + + color: #ffffff !important; + /*border-bottom: 1px solid #D3D3D3;*/ + /*border-style: solid none solid none;*/ + font-family: Lato, tahoma; + padding-top: 2px; + /*margin-bottom: 2px;*/ + padding-bottom: 2px; + /*height: 27px;*/ + +} + +.nav a { + color: #6E6E6E !important; + font-family: Lato, tahoma; +} + +.nav a:hover { + color: black !important; +} + +#quickAddTextField, #quickAddNote { + + /*border-bottom: 1px solid gray;*/ + /*border-top: 0px;*/ + /*border-left: 1px;*/ + /*border-right: 0px;*/ + /*width:650px; min-width:650px !important; */ + /* background: #eeeeee; */ + margin: 2px; + border-radius: 3px !important; + +} + +#quickAddTextField:focus { + border: 1px solid #9FA19E; + background: #ffffff; + +} + +a:hover { + /*color: white !important;*/ + text-decoration: underline !important; + cursor: pointer; + /*font-weight: bold;*/ +} + +.menuButton { + font-size: 11px; + padding: 0 5px; +} + +/* MESSAGES AND ERRORS */ + +div.errors { + background: #fff3f3; + border: 1px solid red; + color: #cc0000; + margin: 10px 0 5px 0; + padding: 5px 0 5px 0; +} + +div.errors ul { + list-style: none; + padding: 0; +} + +div.errors li { + background: url(../images/skin/exclamation.png) 8px 0% no-repeat; + line-height: 16px; + padding-left: 30px; +} + +td.errors select { + border: 1px solid red; +} + +td.errors input { + border: 1px solid red; +} + +/* TABLES */ + +table { + /*border: 1px solid #ccc;*/ +} + +.tableList { + /*width: 90% !important;*/ +} + +tr { + border: 0; +} + +.list td { + /*min-width:60px;*/ + padding-top: 5px; + padding-bottom: 5px; +} + +td, th { + font: 12px tahoma, verdana, arial, helvetica, sans-serif; + line-height: 15px; + padding: 2px; + /*text-align: left;*/ + vertical-align: top; +} + +th { + font: 11px tahoma, verdana, arial, helvetica, sans-serif !important; + /*font-weight:normal !important;*/ + background: #fff url(../images/skin/shadow.jpg); + color: #666; + /*font-size: 12px;*/ + /*font-weight: bold;*/ + line-height: 17px; + padding: 2px 8px; + text-align: center; +} + +th a:link, th a:visited, th a:hover { + /*color: #333;*/ + display: block; + font-size: 12px; + /*text-decoration: none;*/ + width: 100%; + font-weight: bold !important; + cursor: pointer; +} + +th.asc a, th.desc a { + background-position: right; + background-repeat: no-repeat; + padding-right: 7px; +} + +th.asc a { + background-image: url(../images/skin/sorted_asc.gif); +} + +th.desc a { + background-image: url(../images/skin/sorted_desc.gif); +} + +.odd { + background: #f7f7f7; +} + +.even { + background: #fff; +} + +/* LIST */ + +.list table { + border-collapse: collapse; + /*margin-top:10px;*/ + /*width:95% !important;*/ + border-radius: 3px; +} + +.list th, .list td { + border-left: 1px solid #ddd; +} + +.list th:hover, .list tr:hover { + /*background: #d6d9da;*/ + /*cursor: pointer;*/ +} + +.banner tr td { + padding: 0px; + margin: 0px; +} + +.banner a { + color: white; + padding-right: 6px; +} + +/* PAGINATION */ + +.paginateButtons { + /*background: #fff url(../images/skin/shadow.jpg) bottom repeat-x;*/ + /*border: 1px solid #ccc;*/ + border-top: 0; + color: #666; + font-size: 11px; + overflow: hidden; + padding: 7px 5px; + margin: 10px; +} + +.paginateButtons a { + background: #fff; + border: 1px solid #ccc; + border-color: #ccc #aaa #aaa #ccc; + border-radius: 3px; + color: #666; + margin: 0 3px; + padding: 2px 4px; +} + +.paginateButtons span { + padding: 2px 3px; +} + +.currentStep { + font-size: 13px; + font-weight: bold; + color: #997008; +} + +/* DIALOG */ + +.dialog table { + margin: 2px; + padding: 5px 0; +} + +.prop { + padding: 5px; +} + +.prop .name { + text-align: left; + width: 20%; + white-space: nowrap; +} + +.prop .value { + text-align: left; + width: 33%; + white-space: nowrap; +} + +.dialogshow .prop .value { + text-align: left; + width: 25%; + background: #f5f5da; /* beige */ +} + +.rectangle { + /*background: #def4ff;*/ + /*padding:10px;*/ + margin: 5px; + + /*border:solid #adc1db 1px;*/ +} + +.rectangle table th { + font-size: 12px; +} + +.rectangle table { + /*background: #def4ff;*/ + /*padding:2px;*/ + margin-top: 4px !important; + /*border:solid #adc1db 1px;*/ +} + +/* ACTION BUTTONS */ + +.buttons { + background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; + border: 1px solid #ccc; + color: #666; + font-size: 10px; + margin-top: 15px; + overflow: hidden; + +} + +.buttons input { + background: #fff; + border: 0; + color: #333; + cursor: pointer; + font-size: 10px; + font-weight: bold; + margin-left: 3px; + overflow: visible; + padding: 2px 6px; + text-align: left; +} + +.buttons input.delete { + background: transparent url(../images/skin/database_delete.png) 5px 50% no-repeat; + padding-left: 28px; + padding-top: 3px; + padding-bottom: 3px; +} + +.buttons a.delete { + background: transparent url(../images/skin/database_delete.png) 5px 50% no-repeat; + padding-left: 28px; + padding-top: 3px; + padding-bottom: 3px; +} + +.buttons input.show { + background: transparent url(../images/skin/database_table.png) 5px 50% no-repeat; + padding-left: 28px; +} + +.buttons { + padding: 3px !important; +} + +.list a { + color: #333333; + /*text-decoration:underline;*/ +} + +#ui-datepicker-div { + /* Minimum of '5' is required */ + z-index: 999999 !important; +} + +img { + border: none; +} + +label { + display: block; + color: #474646; +} + +div.calendar { + z-index: 99999; +} + +.showvalue { + font-weight: normal; + font-size: 13px; + color: #333333; + /*background: #f5f5dc;*/ +} + +.showLabel { + font-weight: normal; + font-size: 12px; + color: #4f4e4e; + padding-bottom: 4px; + /*background: #f5f5dc;*/ +} + +.alert { + background: #f3f8fc url(../images/skin/information.png) 8px 50% no-repeat; + border: 1px solid #b2d1ff; + color: #006dba; + margin: 10px 0 5px 0; + padding: 5px 5px 5px 30px +} + +#actionsBox { + height: 20px; +} + +.alert { + color: red; +} + +#menu li ul, #menu > li, #menu, #notificationArea, #menu .middle { + background: #525262 !important; +} + +.multi-column-listing { + -moz-column-count: 4; + -webkit-column-count: 4; +} + +.appCardHead { + padding: 4px; + vertical-align: top; + background: #6d94a8; + font-weight: bold; + color: white; +} + +.appCardBody { + border: 1px rgba(109, 148, 168, 0.11) !important; + + padding: 4px; + margin: 4px; + font-size: 11px; + font-family: Lato, verdana; +} + +.appCardContainer { + width: 98%; + background: #F9FCFD; + margin: 8px; + padding: 0px; + + /*height: 250px !important;*/ + float: left; + + overflow: auto; + border: 1px solid #bababa; + +} + +/*#rssList td {*/ +/*color: #105CB6;*/ +/*text-decoration: none;*/ +/*}*/ + +#rssList td { + border-right: 0px solid #D7D7D7; + /*float: left;*/ + margin-left: 9px; + padding-right: 9px; +} + +#rssList td a { + font-size: 12px !important; + font-family: Lato, "Segoe UI", verdana, Geneva, Arial, Helvetica, sans-serif !important; + color: white !important; + text-decoration: none; +} + +#rssList { + /*float: right;*/ + /*direction: ltr;*/ + text-align: start; + margin-right: -1px; + padding-top: 0em; + font-size: 12px; + /*font-family: arial;*/ + /*list-style: none outside none;*/ +} + +#shortcutKeyList { + float: left; + margin-right: -1px; + padding-top: 0.4em; + font-size: 10px; + list-style: none outside none; +} + +.nicelisting { + font-size: 13px; + font-family: Lato, "DejaVu Sans Mono"; + line-height: 20px; +} + +.ui-tabs .ui-tabs-panel { + /*height: 530px;*/ + overflow-y: auto; + z-index: 3 !important; +} + +#panoramasTab > a { + margin-right: 10px; + /*font-size: 11px;*/ + padding: 10px; + font-family: Lato, "DejaVu Sans Mono"; +} + +#panoramasTab a:hover { + text-decoration: underline; + background: #a3bdd0; +} + +.accordion ul li { + padding: 3px; + font-size: 14px; + /*font-family: "DejaVu Sans Mono";*/ +} + +.goalType1 { + color: green; +} + +.goalType2 { + color: blue; +} + +.goalType3 { + color: #ff4500; +} + +.goalType4 { + color: #9d860a; +} + +.goalType17 { + color: #585441; +} + +.exrNotRead { + color: #040f29 !important; + font-size: 12px !important; + font-family: Lato, verdana !important; + font-weight: bold !important; +} + +.exrRead { + color: #006666 !important; + font-size: 11px !important; + font-family: Lato, tahoma !important; +} + +.urgent { + background: #dfd2c1; +} + +.writing { + background: #ecf0f0; + color: black; +} + +.writing2 { + background: #babbbb; + color: black; +} + +/*.ui-datepicker {*/ +/*width: 15em;*/ +/*height: 15em;*/ +/*}*/ + +.hing { + font-size: 14px; + font-weight: bold; + color: #333333; + cursor: pointer; + text-decoration: underline; +} + +.published { + background: #ececc8; +} + +.bookmarked { + text-decoration: underline; +} + +.activeCourse { + background: #ececc8; + +} + +.reality { + color: #660000; +} + +.req { + font-size: 12px; + color: red; +} + +.fullTextPopup { + font-size: 12px; + font-family: Lato, "DejaVu Sans Mono"; + line-height: 20px; +} + +.outputTab { + background: #7d8d9c !important; +} + +.outputTab a { + color: white !important; +} + +.inputTab { + background: #d4a9ae !important; +} + +.inputTab a { + color: white !important; +} + +.addTab { + background: #bdc8cc !important; +} + +.browserTab { + background: #c1ccd0 !important; +} + +.browserTab a { + color: #000000 !important; +} + +.journalTab { + background: #9ed4bb !important; +} + +.journalTab a { + color: white !important; +} + +.agendaTab { + background: #d5c3bb !important; +} + +.agendaTab a { + color: white !important; +} + +.addTab a { + color: #000000 !important; +} + +.reportTab { + background: #bcd0d6 !important; +} + +.reportTab a { + color: white !important; +} + +.count { + font-style: italic; + font-size: 8px; +} + +#MB_content { + overflow: auto !important; + height: 470px !important; + background: #fff; +} + +.card { + border-radius: 3px; + margin: 5px; + padding: 5px; + width: 620px; +} + +.ui-tabs-vertical { + margin: 5px; + /*height: 530px;*/ +} + +.ui-tabs-vertical .ui-tabs-nav { + padding: 1em .1em 1em .2em; + float: left; +} + +.ui-tabs-vertical .ui-tabs-nav li { + clear: left; + width: 10em; + border-bottom-width: 1px !important; + border-right-width: 0 !important; + margin: 0 -1px .2em 0; +} + +.ui-tabs-vertical .ui-tabs-nav li a { + display: block; +} + +.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-selected { + padding-bottom: 0; + padding-right: .1em; + padding-left: .1em; + border-right-width: 1px; + /*color: white;*/ +} + +.ui-tabs-vertical .ui-tabs-panel { + padding: 0.95em; + border-radius: 3px !important; +} + +/* overrides for ui-tab styles */ +ul.ui-tabs-nav { + padding: 0 0 0 5px; +} + +.ui-tabs-nav li { + margin: 3px 3px 0 0; +} + +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + /*font-size: 12px;*/ +} + +.ui-accordion li { + padding: 2px; +} + +.printOnly { + display: none; +} + +.fixed-layout { + table-layout: auto; + width: 100%; + border-spacing: 0; +} + +.record-selection { + width: 20px; + font-size: 10px; + text-align: left; + white-space: nowrap; +} + +.record-id { + width: 65px !important; + font-size: 12px; + color: #fff; + text-align: left; + white-space: nowrap; +} + +.record-realid { + width: 30px; + font-size: 13px; + text-align: left; + white-space: nowrap; +} + +.record-realid a { + font-size: 12px; + text-align: left; + white-space: nowrap; +} + +.record-course { + width: 70px; + font-size: 11px; + padding: 2px; + text-align: center; + /*font-family: georgia;*/ + font-weight: normal; + + /*font-family: Courier;*/ + + /*padding: 1px;*/ + /*margin-left: 5px;*/ + +} + +.record-type { + width: 90px; + font-size: 11px; + text-align: left; + font-family: Lato, georgia; + font-weight: normal; + font-style: italic; + overflow: hidden; + padding-left: 4px; + padding-right: 4px; +} + +.record-date { + /*width: 140px;*/ + font-size: 11px; + font-style: normal; + font-family: Lato, "Lucida Console"; +} + +.record-summary { + /*width: auto;*/ + font-family: Lato, tahoma; + padding-left: 0px; + padding-right: 2px; + /*font-size: 11px;*/ + text-align: left; + vertical-align: top !important; +} + +.record-summary a { + font-family: Lato, tahoma; + /*"Lucida Sans";*/ + font-size: 10px; + text-align: left; + vertical-align: top !important; +} + +.record-status { + width: 120px; + font-size: 11px; + font-style: italic +} + +.record-statistics { + width: 140px; + font-size: 10px; + font-style: italic; + text-align: center; +} + +.record-actions { + width: 20px; +} + +.record-priority { + font-size: 12px; + color: white; + width: 35px; + +} + +.record-level { + font-size: 12px; + color: white; + width: 60px; + +} + +.priority5 { + background: #641b0c; +} + +.priority4 { + background: #c99b87; +} + +.priority3 { + background: #f0ce9d; +} + +.priority2 { + background: #a2e696; + +} + +.priority1 { + background: #d8f7da; +} + +.priorityText4 { + color: darkblue !important; +} + +.priorityText3 { + color: darkgreen !important; +} + +.priorityText2 { + /*color: #darkgray;*/ +} + +.priorityText1 { + color: darkgray !important; +} + +.priorityText0 { + color: lightgrey !important; +} + +.levelY { + background: #641b0c; +} + +.levelM { + background: #c99b87; +} + +.levelW { + background: #639775; +} + +.levelD { + background: #a2e696; +} + +.levelm { + background: #d8f7da; +} + +.recordLine { + background: #fafafa; +} + +.recordLine td { + vertical-align: middle; + padding: 1px; +} + +.D-bkg { + background: #36c699; + padding: 4px; +} + +.C-bkg { + background: #36c676; + padding: 4px; +} + +.G-bkg { + background: #a1c650; + padding: 4px; +} + +.T-bkg { + background: #cbe0a1; + padding: 4px; +} + +.P-bkg { + background: #238cCC; + /*#f3ffcc;*/ + padding: 4px; +} + +.Y-bkg { + background: #808080; + padding: 4px; +} + +.X-bkg { + background: #808080; + padding: 4px; +} + +.ID-bkg:hover { + background: olivedrab; + padding: 4px; +} + +.J-bkg { + background: #90accf; + padding: 4px; +} + +.W-bkg { + background: #fac69b; + padding: 4px; + color: white; +} + +.N-bkg { + background: #fa8042 !important; + padding: 4px; +} + +.non-genuineNote { + background: #fad5c1; + padding: 4px; +} + +.S-bkg { + background: #ae9485; + padding: 4px; + color: white; +} + +.I-bkg { + background: #a2c3ea; + padding: 3px; + color: white; +} + +.Q-bkg { + background: #cee4ff; + padding: 3px; +} + +.R-bkg { + background: #c38ea3; + padding: 3px; +} + +.E-bkg { + background: #f6b2cf; + padding: 3px; +} + +.recordContainer { + /*background: #f2f2f2;*/ + -moz-border-bottom-colors: none; + -moz-border-left-colors: none; + -moz-border-right-colors: none; + -moz-border-top-colors: none; + /*border-color: transparent transparent #8ab2b6;*/ + /*border-image: none;*/ + /*border-style: solid;*/ + /*border-width: 1px;*/ +} + +.justUpdated { + background: #eeffe4 !important; +} + +/*.workStatus-completed a, .status2 a {*/ +/*color: #78a870 !important;*/ +/*}*/ + +.status-pending a, .status-cyc a, .status-upd a { + color: #848034 !important; +} + +.workStatus-completed a, .status3 a, .status-tbk a, .status-ref a { + color: #4972d1 !important; +} + +.status-fix a, .status-coln a { + color: #247c31 !important; +} + +.status-pending a { + color: gray !important; +} + +.status-dis a { + color: gray !important; + text-decoration: line-through; +} + +.status-nst a { + color: #7894a5 !important; + /*font-weight: bold;*/ +} + +.status-done a { + color: #7894a5 !important; + /*font-weight: bold;*/ + text-decoration: line-through; +} + +.status-ready a { + color: #7894a5 !important; + /*font-weight: bold;*/ +} + +.status-almost a, .status-draft a { + color: #195c5e !important; + /*font-weight: bold;*/ +} + +.status-in-progress a, .status-fortesting a { + color: #4b9d67 !important; + /*font-weight: bold;*/ +} + +.status-dismissed a, .status-deferred a, .status-completed a { + color: #4b4f5e !important; + text-decoration: line-through; +} + +.status-10 a { + color: #8c8b46 !important; + /*text-decoration: underline;*/ + /*text-decoration-line: line-through;*/ +} + +/*.status-deferred a {*/ +/*}, .status10 a, .status2 a, .status5 a {*/ +/*color: #d14550 !important;*/ + +/*}*/ + +.navHidden { + display: none !important; +} + +.my3Buttons { + height: 20px; + width: 30px; +} + +.my3Buttons2 { + height: 40px; + width: 30px; +} + +#navMenu { + vertical-align: top; + + position: fixed; + top: 29px; + left: 0px; + overflow: auto; + height: 590px; + width: 235px; +} + +.icon-starred-gm { + background: url("../images/mail.png") no-repeat scroll -20px -20px transparent; + width: 15px; + height: 15px; + display: block; +} + +.icon-star-gm { + background: url("../images/mail.png") no-repeat scroll 0px -20px transparent; + width: 15px; + height: 15px; + display: block; +} + +.deleted { + text-decoration: line-through; + color: #dcdcdc; +} + +.actionLink { + /*background: #4c61fe;*/ + border-radius: 3px; + border: 0px solid; + margin: 2px; + padding: 2px; + font-weight: normal; + color: darkgray !important; +} + +.arabicText { + direction: rtl !important; + text-align: justify !important; +} + +.RTLText { + direction: rtl !important; + text-align: justify !important; +} + +.textar { + direction: rtl !important; + text-align: right !important; +} + +.textfa { + direction: rtl !important; + text-align: right !important; +} + +.textfr { + direction: ltr; +!important; + text-align: left !important; +} + +.texten { + direction: ltr; +!important; + text-align: left !important; +} + +.LTRText { + direction: ltr !important; + text-align: left !important; +} + +.newFile { + color: green !important; +} + +.tbkFile { + color: darkblue !important; +} + +.libFile { + color: darkred !important; +} + +.vxrFile { + color: brown !important; +} + +.abkFile { + color: orange !important; +} + +.shiftEnterPressed { + background: #cde1d2 !important; + border: #ffffff; +} + +.actionTd { + width: 25px !important; +} + +.actionTdBig { + width: 60px !important; +} + +.actionTd a { + font-size: small; + color: dimgray; + /*padding:0px;*/ + +} + +.secondLine { + background: #eeeeee !important; + color: #5c5c5c !important; +} + +.secondLine a { + background: #eeeeee !important; + color: #5c5c5c !important; +} + +.isRead { + color: #335e32 !important; + /*text-decoration: line-through;*/ + /*text-decoration-color: #eeeeee;*/ +} + +.private { + color: #f3f3f3 !important; + font-size: 6px !important; +} + +.private a { + color: #f3f3f3 !important; + font-size: 6px !important; +} + +.box-priority-3 { + background: #77363b; +} + +.box-priority-4 { + background: #d40009; +} + +@media print { + + .nonPrintable { + display: none; + } + + .printOnly { + visibility: visible; + } + + .fg-button { + visibility: hidden; + display: none !important; + } + + .actionTd { + visibility: hidden !important; + display: none !important; + } + + .record-selection { + visibility: hidden !important; + display: none !important; + } + + .status { + visibility: hidden !important; + display: none !important; + } + + .course { + visibility: hidden !important; + display: none !important; + } + + .writing { + visibility: hidden !important; + display: none !important; + } + + .idCell { + visibility: hidden !important; + } +} + +#purr-container { + position: fixed; + top: 0; + right: 0; + z-index: 10000; +} + +.notice { + position: relative; + width: 324px; + z-index: 10000; + font-size: 12px; +} + +.notice .close { + position: absolute; + top: 12px; + right: 12px; + display: block; + width: 18px; + height: 17px; + text-indent: -9999px; + background: url(../images/purrClose.png) no-repeat 0 10px; +} + +.notice-body { + min-height: 50px; + padding: 22px 22px 0 22px; + background: url(../images/purrTop.png) no-repeat left top; + color: #f9f9f9; + z-index: 10000; +} + +.notice-body img { + width: 50px; + margin: 0 10px 0 0; + float: left; + z-index: 10000; +} + +.notice-body h3 { + margin: 0; + font-size: 1.1em; +} + +.notice-body p { + margin: 5px 0 0 60px; + font-size: 0.8em; + line-height: 1.1em; + z-index: 10000; +} + +.notice-bottom { + height: 22px; + background: url(../images/purrBottom.png) no-repeat left top; + z-index: 10000; +} + +.moduleCount { + float: right; + font-size: 12px; + font-weight: 500;; +} + +ul.ui-autocomplete.ui-menu { + z-index: 100000; +} + +.accordionHeader { + color: white !important; + background: #9FA19E; + border-top: 1px solid #6d6d74; + border-bottom: 1px solid #6d6d74; + margin-top: 3px; + margin-bottom: 3px; + + /*4e5f6e;*/ + font-weight: bold; + font-size: 12px; + /*margin: .2em 0 .2em 0;*/ + padding: 3px; + /*margin-left: 1em;*/ + font-family: Lato, "DejaVu Sans Mono"; + +} + +h3, h4 { + /* Headers & Footer in Center & East panes */ + font-size: 0.9em; + /*background: #D8D4C9;*/ + border-bottom: 1px solid #BBB; + border-width: 0 0 1px; + padding: 5px 5px; + margin: 0; +} + +h2 { + font-family: Lato, Georgia; + color: rgb(92, 109, 121); + font-weight: bold; + /*line-height: 40px;*/ + /* Headers & Footer in Center & East panes */ + font-size: 1.1em; + /*background: #D8D4C9;*/ + border-bottom: 0.5px #BBB solid; + border-width: 1px 0 0; + padding: 7px 5px; + margin: 0; +} + +.ui-helper-reset { + font-size: 12px !important; + /*0.99em !important;*/ +} + +ul.ui-autocomplete.ui-menu { + z-index: 1000 !important; +} + +.typeahead, +.tt-query, +.tt-hint { + /*width: 396px;*/ + /*height: 30px;*/ + /*padding: 8px 12px;*/ + /*font-size: 24px;*/ + /*line-height: 30px;*/ + background: #ffffff; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + outline: none; +} + +.typeahead { + background-color: #fff; +} + +.typeahead:focus { + border: 2px solid #0097cf; +} + +.tt-query { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.tt-hint { + color: #999 +} + +.tt-dropdown-menu { + /*width: 422px;*/ + z-index: 1000; + /*margin-top: 12px;*/ + padding: 4px 0; + background: #ffffff !important; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} + +.tt-suggestion { + /*padding: 3px 20px;*/ + /*font-size: 18px;*/ + /*line-height: 24px;*/ +} + +.tt-suggestion.tt-cursor { + color: #fff; + background-color: #0097cf; +} + +.tt-suggestion p { + margin: 0; +} + +.gist { + /*font-size: 14px;*/ +} + +.commandMode { + background: #ffcabf !important; +} + +.testhide { + /*display: none;*/ + visibility: hidden; +} + +.hiddenActions { + /*display: none;*/ + /*padding: 0px;*/ + visibility: hidden; +} + +.actionsButtons { + /*visibility: hidden;*/ + padding: 2px; +} + +.actionsButtons a { + color: #0b202f !important; + font-style: normal !important; + font-size: 10px !important; + text-decoration: none !important; + border: 0.5px solid darkgray !important; + border-radius: 3px !important; + padding: 2px; + margin-left: 2px; + margin-right: 2px; +} + +.actionsButtonsStyle a { + font-size: 10px !important; + color: #0b1336 !important; + font-style: normal !important; + text-decoration: underline !important; + padding: 2px; + margin: 1px; +} + +.actionsButtonsStyle { + padding: 2px; + margin-top: 2px; + margin-bottom: 5px; + /*background: floralwhite;*/ +} + +.showhim { + display: block; +} + +/*.showhim:hover .actionsButtons{*/ +/*display : block;*/ +/*background: #ddd;*/ +/*}*/ + +.showhim:hover .testhide { + display: block; + visibility: visible; + background: #ddd; + color: black; +} + +.width95 { + width: 95% !important; +} + +.record-summary:hover { + /*background: #e8f5e4;*/ +} + +.dashboardNumber { + font-size: 24px; + /*font-style: italic;*/ +} + +.dashboardLabel { + font-size: 14px; + font-family: Lato, "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + text-align: right; + float: right; +} + +.dashboardCell { + /*background: #d4d4d4;*/ + padding: 10px; + margin: 5px; + border: solid thin #006666; +} + +.westRegion { + /*background: #f1f1f1 !important;*/ + +} + +.eastRegion { + /*background: #f1f1f1 !important;*/ + /*background: #D8D4C9 !important;*/ + +} + +/*.northRegion .southRegion {*/ +/*padding: 0px;*/ +/*margin: 0px;*/ +/*overflow: hidden;*/ +/*border-bottom: solid 0px #eee;*/ +/*height: 35px;*/ +/*/!*background: #525262 !important;*!/*/ +/*}*/ + +.commandBarRegion { + /*background: #D8D4C9 !important;*/ +} + +.southRegion { + /*background: rgb(102, 121, 134) !important; !*#BAC2BA !important;*!*/ + /*border-color: #818284 !important; !*#BAC2BA !important;*!*/ + /*color: black;*/ + /*height: 20px;*/ +} + +.southRegion a { + color: black !important; + font-weight: normal; +} + +.commandBarTexField { + font-family: Lato, tahoma !important; + font-size: 1.1em; + width: 98% !important; + height: 160px; + background: #dce5e5; + margin: 0px !important; +} + +.dis { + color: black; +} + +.error { + color: red + +} + +.correct { + color: darkgreen; + +} + +.overDueDate { + background: lightcoral !important; + color: darkred; +} + +#writingNote_chzn { + width: 95% !important; +} + +.commandBarInPanel { + margin-top: 10px; +} + +.commandBarTexFieldTop { + background: #eeeeee; + /*direction: ltr;*/ + text-align: start; +} + +.ui-accordion-header :hover { + /*background: #c1c1c1 !important;*/ + border: 0px solid #797979 !important; + /*color: white;*/ +} + +.ui-accordion-header a :hover { + background: #e0e0e0 !important; + border: 0px solid #9b9b9b !important; + /*color: white;*/ +} + +.footerRegion { + height: 20px; + padding: 5px; + /*background: #6D6D74 url(../images/bg-header.gif) no-repeat !important;*/ + /*background: rgb(119, 141, 156) !important; !*#BAC2BA !important;*!*/ + /*border-color: rgb(119, 141, 156) !important; !*#BAC2BA !important;*!*/ + /*background: #BAC2BA !important;*/ + /*color: black;*/ +} + +.footerRegion a { + font-size: 12px !important; + font-family: Lato, "Segoe UI", verdana, Geneva, Arial, Helvetica, sans-serif; + color: white !important; +} + +.accordionPanelSettings { + background: #eeedef; + border: 1px lightgray solid; +} + +.accordionPanelBrowse { + /*background: #cfd2cc;*/ + border: 1px lightgray solid; +} + +.accordionPanelAdd { + background: #ecefe8; + border: 1px lightgray solid; +} + +.focusPSouth { + color: white; + /*font-style: italic;*/ + text-decoration: underline; + font-size: 11px; + padding-left: 10px; + padding-right: 10px; +} + +.todoTask { + background: darkgray !important; + color: white !important; +} + +.todoTask a { + background: darkgray !important; + color: white !important; +} + +.settingsUL li ul li { + padding-left: 10px; +} + +#accordionModules div a { + padding-left: 3px; +} + +#accordionModules div ul { + padding-left: 25px; +} + +.message { + background: #f3f3ff; + border: 1px solid #5C6D79; + margin: 10px; + padding: 5px; + color: #47555e; + -moz-box-shadow: 0 0 0.25em #5C6D79; + -webkit-box-shadow: 0 0 0.25em #5C6D79; + box-shadow: 0 0 0.25em #5C6D79; +} + +.wrongCommand { + background: #ffdbc8 !important; +} + +.correctCommand { + background: #e1fedc !important; +} + +a { + color: black; +} + + +.actionsButtons a:hover { + border: 2px dashed #a3a3a3 !important; +} + + +.kanbanTables td { + padding: 4px !important +} + +.kanbanTables > td { + padding: 4px !important + margin: 3px !important; + border-radius: 4px !important; +} \ No newline at end of file diff --git a/src/main/resources/public/css/main.css b/src/main/resources/public/css/main.css index 1e2ea16..afe7e89 100644 --- a/src/main/resources/public/css/main.css +++ b/src/main/resources/public/css/main.css @@ -210,7 +210,7 @@ input, select, textarea { background-color: #fcfcfc; border: 1px solid #ccc; font: 11px lato, tahoma, verdana, arial, helvetica, sans-serif; - margin: 1px 0; + margin: 2px 2px; padding: 2px 2px; min-width: 20px !important; border-radius: 2px !important; @@ -383,7 +383,7 @@ td, th { font: 12px tahoma, verdana, arial, helvetica, sans-serif; line-height: 15px; padding: 2px; - text-align: left; + /*text-align: left;*/ vertical-align: middle; } @@ -982,7 +982,7 @@ ul.ui-tabs-nav { } .record-id { - width: 35px !important; + width: 65px !important; font-size: 12px; color: #fff; text-align: left; @@ -1986,4 +1986,12 @@ ul.ui-autocomplete.ui-menu { .correctCommand { background: #e1fedc !important; +} + +a { + color: black; +} + +a :hover { + border: 1px solid #a3a3a3; } \ No newline at end of file