Tuesday, September 12, 2017

Monday, August 28, 2017

Angular with tbSort AFTER loading of all ng-repeat





<!--class="{{{'cancelled': 'danger', 'closed': 'warning'}[sect.SECT_STATUS.toLowerCase()] || (((+sect.ENROLLED) >= (+sect.CAPACITY)) && 'warning')}}">-->
<tr ng-repeat="sect in crs.Sections" class="{{(!oldView) ? {'cancelled': 'danger', 'closed':
'warning'}[sect.SECT_STATUS.toLowerCase()] : ''}}">

<td style="vertical-align: middle" ng-repeat="col in cols" ng-if="!!allTitle || !col.hide || !col.hide(crs)" ng-bind-html="col.code(sect)"
class="media-middle {{(!oldView) ? 'highBorder' : 'highBorder'}}">
<!--{{($parent.$parent.$parent.$last &&
$parent.$parent.$last && $parent.$last && $last) &&
finish(sect)}}-->
<div ng-if="$parent.$parent.$parent.$last && $parent.$parent.$last && $parent.$last && $last">
<div ng-init="finish()"></div>
</div>






$scope.finish = function (it) {
// $scope.prnt($scope.curTerm + $scope.curSubj, true)
$scope.prnt('finish()')
if (!!$scope.wait || !$scope.loading) return
if (!!it) $scope.prnt(it)
// $('[data-toggle="tooltip"]').tooltip()
// $('[data-toggle="popover"]').popover()
$('.header').off('click').removeClass('header')
$('.tbSort').each(function () {
if ($(this).find('tr').length > 2) {
$(this).tablesorter()
}
})
// $scope.prnt($('.tbSort'))
$scope.loading = false
$scope.prnt('done')
}

Wednesday, August 16, 2017

Mapping a table or sequence to a schema

static mapping = {
    def cls = "admin"    def appName = "see"
    table     name: "${appName}_${cls}", schema: "NJITSRC"    id          column  : "${cls}_id",                generator  : 'sequence', params: [sequence: "${appName}_${cls}_sequence", schema: "NJITSRC"]

Friday, August 11, 2017

Grails Export Plugin 1.5 Controller

 def test = {

     params.exportFormat = 'pdf'     params.format = 'pdf'     params.extension = 'pdf'
     print params

     if(params?.exportFormat && params.exportFormat != "html"){

         response.contentType = grailsApplication.config.grails.mime.types[params.exportFormat]

         response.setHeader("Content-disposition", "attachment; filename=hangtags.${params.extension}")


         List<String> fields = ['id', 'address']
         Map labels = [address:"Address", deliverVia: ""]



         /* Formatter closure in previous releasesdef upperCase = { value ->   return value.toUpperCase()}*/
         // Formatter closure         def upperCase = { domain, value ->
             return value.toUpperCase()
         }

         Map formatters = [address: upperCase]
         Map parameters = [title: "Hangtags", "column.widths": [0.2, 0.3, 0.5]]

         exportService.export(params.format, response.outputStream, HangTag.list(), fields, labels, formatters, parameters)

         [HangTag: HangTag.list()]

     }
 }

Front End Validation

1. If there is an ng-del checkbox newHt and existing hangtag

ng-disabled="(${hangTag ? true : false} && !newHt)"

Passing date from Oracle timestamp/ Grails backend to Javascript/ Angular controller


res.htDateDeliveredY = res.hangTag.dateDelivered.toString()[0..3].toInteger()
res.htDateDeliveredM = (res.hangTag.dateDelivered.toString()[5..6]).toInteger() - 1res.htDateDeliveredD = res.hangTag.dateDelivered.toString()[8..9].toInteger()



$scope.htDateDelivered = new Date(${htDateDeliveredY},${htDateDeliveredM},${htDateDeliveredD})



OR


var dateDelivered = "${htDateDeliveredY}-${htDateDeliveredM}-${htDateDeliveredD}";document.getElementById("delDate").value = dateDelivered;console.log(dateDelivered);

Thursday, August 3, 2017

Domain Class

package main

import grails.util.Holders

/** * This domain class holds details (individual courses) of a request for combining 2 or more courses. * This domain class is used with "Request" domain class. * * READ DESCRIPTION IN "REQUEST" DOMAIN CLASS. * * !! RUN THE FOLLOWING LINE IN ORACLE DATABASE TO CREATE A SEQUENCE FOR THIS TABLE !! * CREATE SEQUENCE  "NJIT_GNS"."LMIS_REQUESTINFO_SEQUENCE"  MINVALUE 1 NOMAXVALUE INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ; * * Columns: ( ** indicates "important". * indicates "not important but being used". nothing indicates "not being used") *      "id"             is a primary key and created by default *      "version"        is created by default *   ** "req"            is "Request" object to indicate this course belong to which request *   ** "crn"            is CRN of this course. "crn" and "term" together form a composite unique key *   ** "term"           is "Term" object to indicate this course belong to which term. "crn" and "term" together form a composite unique key *      "schd_code"      is "SCHD_CODE" of this course (e.g. 'LEC','ADV','LLB',etc.) *   ** "active"         is general column to indicate whether this course is active or inactive (inactive indicates this course is no longer a part of a combined course) *    * "lastUpdated"    is general column for datetime this data is last updated *    * "updater"        is general column for UCID of the person who updated this data */class RequestInfo {

    def springSecurityService

    String updater, crn, schd_code, section    Boolean active    Date lastUpdated    Term term    Request req
    static  belongsTo = Request

    def beforeValidate = {
//    defaults        active     = (active == null) ? true : active        updater = updater ?: springSecurityService.principal.usr.ucid
    }

    static mapping = {
      def cls = className.split('main.')[-1].toLowerCase()
      def appName = Holders.grailsApplication.config.app.name

      table     "${appName}_${cls}"        id       column : "${cls}_reqinfoid",       generator  : 'sequence', params: [sequence: "${appName}_${cls}_sequence"]
//    version    false        version       column : "${cls}_version",          defaultValue: '0'        req         column  : "${cls}_reqid"        crn         column  : "${cls}_crn"        section     column  : "${cls}_section"        term        column  : "${cls}_term"        schd_code   column  : "${cls}_schd_code"        active        column : "${cls}_is_active",     defaultValue: '1'        lastUpdated column : "${cls}_activity_date",  defaultValue: 'sysdate'        updater       column : "${cls}_updated_by"    }

    static constraints = {
        crn          unique : 'term'        crn         size    : 0..20        schd_code   size    : 0..3        updater        maxSize    : 10,      matches: '[a-z0-9]+'        section     nullable: true    }
}

Multiple angular actions on ng click

ng-click="(vhc = ${vhc as grails.converters.JSON}) && (vhc.relate = '${vhc.relate.code}') && (vhcs.vhc_${vhc.id} = !vhcs.vhc_${vhc.id})">

Submit button (angular controller)

<button type="button" class="btn btn-success pull-right"        ng-click="main.submitFrm(formRequest)" ng-init="formRequest.validate = validRegFrm"        ng-disabled="!formRequest.validate(true)" disabled%{--ng-disabled="combineOK < 2 || !radio"--}%
%{--ng-click="reqSubmit()" --}%>
    <i class="fa fa-check" aria-hidden="true"></i> Submit Combine Request
</button>

Tuesday, August 1, 2017

Pass flashScope to webservice

mainService.saveNonNJITUser(user, WebUtils?.retrieveGrailsWebRequest()?.flashScope)

Redirect from action to another - with params

redirect(action: 'hangtagIndividual', params: [njitID: params.njitID, term: params.term])

Monday, July 31, 2017

Config values from DB

DATABASE
qry = """insert into NJITVRS_CONFIG (CONFIG_KEY, CONFIG_UPDATED_BY, CONFIG_VALUE) VALUES (?, '${usr}', ?)""".toString()

sql.executeInsert(qry, ['ht_comments', '[NR:"Not Recieved", L : "Lost", S : "Stolen", TC: "Type Change", REF: "Refund", DNP : "Do Not Process", DEL: "Deleted", RES:"Resigned", RET: "Returned Permit"]'])


CONTROLLER
htComments      : Eval.me(Config.findWhere(key: "ht_comments").value)



FRONT END GSP

<g:select from="${htComments}" noSelection="${['': 'Select']}" optionKey="key"          optionValue="value" class="form-control" name="htComments" id="htComments"          ng-model="htComments"></g:select>

Saving a GORM object

try {
    if (!term.save(flush: true)) {
        term.errors.allErrors.each {
            print it
        }
        flash << [success: false, message: 'Errors while changing term', obj: term]
        return    } else {
        def oldTerms = Term.findAll()
        oldTerms = oldTerms.remove(Term.findIndexOf {term})
        oldTerms.each { oldterm ->
            oldterm.active = false            oldterm.save(flush: true)
        }
        flash << [success: true, message: 'Updated term successfully!']
    }
}
catch (org.springframework.dao.DataIntegrityViolationException e) {
    flash << [success: false, message: 'Attempted duplicate term', obj: term]
    return false}