├── README.md ├── manager.py ├── ops ├── __init__.py ├── assets │ ├── __init__.py │ └── api.py ├── case │ ├── __init__.py │ └── api.py ├── common │ └── __init__.py ├── config.py ├── database │ ├── __init__.py │ ├── custom_type.py │ └── model.py ├── static │ ├── avatars │ │ ├── avatar.png │ │ ├── avatar1.png │ │ ├── avatar2.png │ │ ├── avatar3.png │ │ ├── avatar4.png │ │ ├── avatar5.png │ │ ├── profile-pic.jpg │ │ └── user.jpg │ ├── css │ │ ├── ace-ie.min.css │ │ ├── ace-rtl.min.css │ │ ├── ace-skins.min.css │ │ ├── ace.min.css │ │ ├── bootstrap-editable.css │ │ ├── bootstrap-timepicker.css │ │ ├── bootstrap.min.css │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ ├── chosen.css │ │ ├── colorbox.css │ │ ├── colorpicker.css │ │ ├── dataTables.bootstrap.css │ │ ├── datepicker.css │ │ ├── daterangepicker.css │ │ ├── dropzone.css │ │ ├── font-awesome-ie7.min.css │ │ ├── font-awesome.min.css │ │ ├── fullcalendar.css │ │ ├── googleapis.css │ │ ├── googleapis_bak.css │ │ ├── images │ │ │ ├── border.png │ │ │ ├── controls.png │ │ │ ├── loading.gif │ │ │ ├── loading_background.png │ │ │ └── overlay.png │ │ ├── img │ │ │ ├── Thumbs.db │ │ │ ├── alpha.png │ │ │ ├── hue.png │ │ │ └── saturation.png │ │ ├── jquery-ui-1.10.3.custom.min.css │ │ ├── jquery-ui-1.10.3.full.min.css │ │ ├── jquery.gritter.css │ │ ├── prettify.css │ │ ├── select2-spinner.gif │ │ ├── select2.css │ │ ├── select2.png │ │ ├── select2x2.png │ │ └── ui.jqgrid.css │ ├── font │ │ ├── fontawesome-webfont-iefix.eot │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ ├── images │ │ ├── gallery │ │ │ ├── thumb-1.jpg │ │ │ ├── thumb-2.jpg │ │ │ ├── thumb-3.jpg │ │ │ ├── thumb-4.jpg │ │ │ ├── thumb-5.jpg │ │ │ └── thumb-6.jpg │ │ ├── spritemap.png │ │ └── spritemap@2x.png │ ├── img │ │ ├── clear.png │ │ └── loading.gif │ └── js │ │ ├── ace-elements.min.js │ │ ├── ace-extra.min.js │ │ ├── ace.min.js │ │ ├── additional-methods.min.js │ │ ├── bootbox.min.js │ │ ├── bootstrap-colorpicker.min.js │ │ ├── bootstrap-tag.min.js │ │ ├── bootstrap-wysiwyg.min.js │ │ ├── bootstrap.min.js │ │ ├── chosen.jquery.min.js │ │ ├── chosen.jquery.min.js.bak │ │ ├── customize.js │ │ ├── dataTables.bootstrap.js │ │ ├── date-time │ │ ├── bootstrap-datepicker.min.js │ │ ├── bootstrap-timepicker.min.js │ │ ├── daterangepicker.min.js │ │ └── moment.min.js │ │ ├── dropzone.min.js │ │ ├── excanvas.min.js │ │ ├── flot │ │ ├── jquery.flot.min.js │ │ ├── jquery.flot.pie.min.js │ │ └── jquery.flot.resize.min.js │ │ ├── fuelux │ │ ├── data │ │ │ └── fuelux.tree-sampledata.js │ │ ├── fuelux.spinner.min.js │ │ ├── fuelux.tree.min.js │ │ └── fuelux.wizard.min.js │ │ ├── fullcalendar.min.js │ │ ├── html5shiv.js │ │ ├── jqGrid │ │ ├── i18n │ │ │ ├── grid.locale-en.js │ │ │ └── grid.locale-en.js.bak │ │ └── jquery.jqGrid.min.js │ │ ├── jquery-1.10.2.min.js │ │ ├── jquery-2.0.3.min.js │ │ ├── jquery-ui-1.10.3.custom.min.js │ │ ├── jquery-ui-1.10.3.full.min.js │ │ ├── jquery.autosize.min.js │ │ ├── jquery.colorbox-min.js │ │ ├── jquery.dataTables.bootstrap.js │ │ ├── jquery.dataTables.js │ │ ├── jquery.dataTables.min.js │ │ ├── jquery.easy-pie-chart.min.js │ │ ├── jquery.gritter.min.js │ │ ├── jquery.hotkeys.min.js │ │ ├── jquery.inputlimiter.1.3.1.min.js │ │ ├── jquery.knob.min.js │ │ ├── jquery.maskedinput.min.js │ │ ├── jquery.min.js │ │ ├── jquery.mobile.custom.min.js │ │ ├── jquery.nestable.min.js │ │ ├── jquery.slimscroll.min.js │ │ ├── jquery.sparkline.min.js │ │ ├── jquery.ui.touch-punch.min.js │ │ ├── jquery.validate.min.js │ │ ├── markdown │ │ ├── bootstrap-markdown.min.js │ │ └── markdown.min.js │ │ ├── ops │ │ ├── caseCheck.js │ │ ├── caseExecute.js │ │ ├── caseHistory.js │ │ ├── caseMyCreate.js │ │ ├── caseType.js │ │ ├── department.js │ │ ├── project.js │ │ └── user.js │ │ ├── respond.min.js │ │ ├── select2.min.js │ │ ├── spin.min.js │ │ ├── typeahead-bs2.min.js │ │ └── x-editable │ │ ├── ace-editable.min.js │ │ └── bootstrap-editable.min.js ├── templates │ ├── assets │ │ └── project.html │ ├── case │ │ ├── caseCheck.html │ │ ├── caseCreate.html │ │ ├── caseExecute.html │ │ ├── caseHistory.html │ │ ├── caseMyCreate.html │ │ └── caseType.html │ ├── index.html │ └── users │ │ ├── department.html │ │ ├── login.html │ │ └── user.html └── users │ ├── __init__.py │ ├── api.py │ └── login.py ├── requirements.txt └── run.py /README.md: -------------------------------------------------------------------------------- 1 | # iamdc 2 | 运维自动化平台(iamdc) 3 | http://www.huangdc.com 4 | 5 | 6 | 一、环境 7 | 系统: CentOS 6 8 | python 版本: Python 2.7.10 9 | 10 | 二、Python 虚拟环境 11 | 12 | 1、安装 13 | pip install virtualenv 14 | 15 | 2、为一个工程创建一个虚拟环境 16 | mkdir /opt/project ; 17 | 18 | cd /opt/project && virtualenv venv 19 | 20 | 3、激活虚拟环境 21 | source venv/bin/activate 22 | 23 | 4、git clone 下载iamdc 24 | git clone https://github.com/BackPotMan/iamdc.git 25 | 26 | 5、安装所需环境 27 | cd iamdc && pip install -r requirements.txt 28 | 29 | 6、初始数据库模型 30 | migrate使用方法: 31 | 第一次使用 python manager.py db init 32 | 33 | 后面每次有表修改执行下面两句进行修改 34 | python manager.py db migrate ; 35 | 36 | python manager.py db upgrade 37 | 38 | 7、运行启动 39 | python run.py 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /manager.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from flask_migrate import Migrate,MigrateCommand 4 | from flask_script import Manager,Shell 5 | from ops.database.model import db 6 | from run import app 7 | 8 | """ 9 | migrate使用方法: 10 | 第一次使用 python manager.py db init 11 | 12 | 后面每次有表修改执行下面两句进行修改 13 | python manager.py db migrate 14 | python manager.py db upgrade 15 | 16 | """ 17 | 18 | manager = Manager(app) 19 | migrate = Migrate(app, db) #注册migrate到flask 20 | manager.add_command('db', MigrateCommand) #在终端环境下添加一个db命令 21 | 22 | 23 | if __name__ == '__main__': 24 | manager.run() 25 | -------------------------------------------------------------------------------- /ops/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from flask import Flask,request,render_template,url_for,redirect,abort,session 3 | from jinja2 import TemplateNotFound 4 | from ops.database.model import db,user 5 | from ops.users.login import userLogin 6 | import sys 7 | reload(sys) 8 | sys.setdefaultencoding('utf-8') 9 | 10 | app = Flask(__name__) 11 | 12 | # 加载配置文件 13 | app.config.from_object('ops.config.DevConfig') 14 | 15 | # #初始化models 16 | db.init_app(app) 17 | db.app = app 18 | db.create_all() 19 | 20 | # 导入蓝图 21 | modules = [ 22 | ('ops.users.api', 'userBlue', '/users'), # 用户管理模块 23 | ('ops.assets.api', 'assetsBlue', '/assets'), # 资源管理模块 24 | # ('ops.deploy.api', 'deployBlue', '/deploy'), # 发布系统模块 25 | ('ops.case.api', 'caseBlue', '/case'), # 工单系统模块 26 | # ('ops.setting.api', 'settingBlue', '/setting'), # 后台设置模块 27 | # ('ops.monitor.api', 'monitorBlue', '/monitor'), # 监控系统模块 28 | ] 29 | for md, blp, prefix in modules: 30 | app.register_blueprint(getattr(__import__(md, fromlist=[blp]), blp), url_prefix=prefix) 31 | 32 | 33 | @app.route('/') 34 | def index(): 35 | 36 | loginData = userLogin() 37 | if loginData['status'] == 1 : 38 | return redirect(loginData['uri']) 39 | 40 | try: 41 | return render_template('index.html',userInfo=loginData['user']) 42 | except TemplateNotFound: 43 | abort(404) 44 | 45 | -------------------------------------------------------------------------------- /ops/assets/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/assets/__init__.py -------------------------------------------------------------------------------- /ops/assets/api.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import json 4 | from jinja2 import TemplateNotFound 5 | from flask import Blueprint, Response,request,render_template,url_for,redirect,abort,session,g 6 | from ops.database.model import db,department,user,project 7 | from sqlalchemy import or_,and_,desc 8 | from ops.users.login import userLogin 9 | 10 | ## 用户蓝图 11 | assetsBlue = Blueprint('assets', __name__ , template_folder='../templates/assets',static_url_path='',static_folder='') 12 | 13 | @assetsBlue.route('/project/', methods=['GET', 'POST']) 14 | def projectList(): 15 | """ 16 | 项目管理管理 17 | """ 18 | # print request.args.items().__str__() 19 | # print request.form.items() 20 | 21 | loginData = userLogin() 22 | if loginData['status'] == 1 : 23 | return redirect(loginData['uri']) 24 | 25 | ## 请求返回结果数据 26 | returnData = {'status': 0, 'message': '','data':[]} 27 | 28 | ## 添加项目 29 | if request.form.has_key('oper') and request.form['oper'] == "add": 30 | name = str(request.form['name']) 31 | enname = str(request.form['enname']) 32 | leader = int(request.form['leader']) 33 | 34 | ## check 35 | checkData = project.query.filter(or_(project.name == name,project.enname == enname)).first() 36 | if checkData: 37 | returnData['status'] = 1 38 | returnData['message'] = '该项目名称已经存在' 39 | return Response(json.dumps(returnData), mimetype="application/json") 40 | 41 | ## add 42 | try: 43 | addData = project(name=name, enname=enname,user_id=leader) 44 | db.session.add(addData) 45 | db.session.commit() 46 | except: 47 | returnData['status'] = 1 48 | returnData['message'] = '新增失败' 49 | return Response(json.dumps(returnData), mimetype="application/json") 50 | 51 | ## 删除项目 52 | elif request.form.has_key('oper') and request.form['oper'] == "del": 53 | ids = str(request.form['id']).split(',') 54 | 55 | for id in ids: 56 | ## check 57 | checkData = project.query.filter(project.id == id).first() 58 | if not checkData: 59 | returnData['status'] = 1 60 | returnData['message'] = returnData['message']+'id:'+str(id)+' 该项目不存在;' 61 | 62 | ## delete 63 | try: 64 | db.session.delete(checkData) 65 | db.session.commit() 66 | except: 67 | returnData['status'] = 1 68 | returnData['message'] = returnData['message'] + 'id:' + str(id) + ' 该项目删除失败;' 69 | return Response(json.dumps(returnData), mimetype="application/json") 70 | 71 | ## 编辑项目 72 | elif request.form.has_key('oper') and request.form['oper'] == "edit": 73 | id = int(request.form['id']) 74 | name = str(request.form['name']) 75 | enname = str(request.form['enname']) 76 | leader = int(request.form['leader']) 77 | 78 | ## check 79 | checkData = project.query.filter(project.id != id).filter(or_(project.name == name,project.enname == enname)).first() 80 | if checkData: 81 | returnData['status'] = 1 82 | returnData['message'] = '该项目名称已经存在' 83 | return Response(json.dumps(returnData), mimetype="application/json") 84 | 85 | ## edit 86 | try: 87 | editData = project.query.filter(project.id == id).first() 88 | editData.name = name 89 | editData.enname = enname 90 | editData.leader = leader 91 | 92 | db.session.add(editData) 93 | db.session.commit() 94 | except: 95 | returnData['status'] = 1 96 | returnData['message'] = '编辑失败' 97 | return Response(json.dumps(returnData), mimetype="application/json") 98 | 99 | ## 获取项目选择框下拉列表 100 | elif request.form.has_key('oper') and request.form['oper'] == "getProjects": 101 | allData = project.query.filter().all() 102 | if allData: 103 | projectStr = "" # 组合成适用于编辑框的select格式 104 | for p in allData: 105 | if projectStr: 106 | projectStr = projectStr + ";" + str(p.id) + ":" + str(p.name) 107 | else: 108 | projectStr = str(p.id) + ":" + str(p.name) 109 | returnData['data'].append({'id': p.id, 'name': p.name, 'enname': p.enname}) 110 | returnData['message'] = projectStr 111 | 112 | else: 113 | returnData['status'] = 1 114 | returnData['message'] = "error" 115 | return Response(json.dumps(returnData), mimetype="application/json") 116 | 117 | ## request.method == "GET": 118 | elif request.args.has_key('type') and request.args.get('type') == "load" or \ 119 | request.args.has_key('type') and request.args.get('type') == "search": 120 | 121 | load_search = request.args.get("_search") 122 | load_nd = int(request.args.get("nd")) 123 | load_rows = int(request.args.get("rows")) 124 | load_page = int(request.args.get("page")) 125 | load_sidx = str(request.args.get("sidx")) 126 | load_sord = str(request.args.get("sord")) 127 | len_min = load_page * load_rows - load_rows 128 | len_max = load_page * load_rows 129 | loadData = {"total": "0", "page": str(load_page), "records": "0", "data": []} 130 | 131 | allData = project.query.filter() 132 | if request.args.get('type') == "search": 133 | _search_cnname = request.args.get("search_cnname") 134 | _search_enname = request.args.get("search_enname") 135 | if _search_cnname: 136 | allData = allData.filter(project.name.ilike('%%%s%%' % _search_cnname)) 137 | if _search_enname: 138 | allData = allData.filter(project.enname.ilike('%%%s%%' % _search_enname)) 139 | 140 | ## sord 141 | if not load_sidx: 142 | load_sidx = "id" 143 | if load_sord == "desc": 144 | allData = allData.order_by(desc(load_sidx)).all() 145 | else: 146 | allData = allData.order_by(load_sidx).all() 147 | 148 | for record in allData[len_min:len_max]: 149 | _mtime = record.mtime 150 | if not _mtime: _mtime = record.ctime 151 | tmpData = {'id': record.id, 152 | 'name': record.name, 153 | 'enname': record.enname, 154 | 'leader': record.user.name, 155 | 'ctime': str(record.ctime), 156 | 'mtime': str(_mtime) 157 | } 158 | loadData['data'].append(tmpData) 159 | 160 | loadData['records'] = str(len(allData)) ## rows 161 | loadData['total'] = str(len(allData) / int(load_rows) + 1) ## pages 162 | 163 | return Response(json.dumps(loadData), mimetype="application/json") 164 | 165 | else: 166 | pass 167 | 168 | try: 169 | return render_template('project.html',userInfo=loginData['user']) 170 | except TemplateNotFound: 171 | abort(404) 172 | 173 | 174 | 175 | 176 | -------------------------------------------------------------------------------- /ops/case/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/case/__init__.py -------------------------------------------------------------------------------- /ops/common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/common/__init__.py -------------------------------------------------------------------------------- /ops/config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | 4 | class Config(object): 5 | 6 | DEBUG = False 7 | # 是否是开发模式 8 | DEV = False 9 | 10 | SECRET_KEY = '\x9bl\xbc\xc6\x01\xaf^\r\x13\xb2\xb2T\xce\x87d\xd1\xf5\x07\xb6r\x8c\r\xe8\x93' 11 | 12 | #数据库iamdcdb 13 | SQLALCHEMY_DATABASE_URI = 'mysql://deployer:A637f37955dbfcE1@192.168.1.18:3306/iamdcdb?charset=utf8' 14 | 15 | # 日志文件 16 | LOG_FILE = "ops.log" 17 | 18 | class DevConfig(Config): 19 | 20 | DEBUG = True 21 | # 开发模式 22 | DEV = True 23 | 24 | # 数据库iamdcdb 25 | SQLALCHEMY_DATABASE_URI = 'mysql://opser:123456@localhost:3306/iamdcdb?charset=utf8' 26 | -------------------------------------------------------------------------------- /ops/database/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/database/__init__.py -------------------------------------------------------------------------------- /ops/database/custom_type.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import sqlalchemy.types as types 4 | 5 | class ChoiceType(types.TypeDecorator): 6 | 7 | impl = types.String(100) 8 | 9 | def __init__(self, choices=[], **kw): 10 | self.choices = dict(choices) 11 | super(ChoiceType, self).__init__(**kw) 12 | 13 | def process_bind_param(self, value, dialect): 14 | result = [k for k, v in self.choices.iteritems() if k == value] 15 | if result: 16 | return result[0] 17 | 18 | def process_result_value(self, value, dialect): 19 | _dict = self.choices 20 | 21 | class Choice(object): 22 | def __init__(self): 23 | if not value == None: 24 | self.label = _dict[value] 25 | self.value = value 26 | else: 27 | self.label = None 28 | self.value = None 29 | return Choice() 30 | 31 | 32 | class ChoiceTypeInteger(types.TypeDecorator): 33 | 34 | impl = types.Integer 35 | 36 | def __init__(self, choices=[], **kw): 37 | self.choices = dict(choices) 38 | super(ChoiceTypeInteger, self).__init__(**kw) 39 | 40 | def process_bind_param(self, value, dialect): 41 | result = [k for k, v in self.choices.iteritems() if k == value] 42 | if result: 43 | return result[0] 44 | 45 | def process_result_value(self, value, dialect): 46 | _dict = self.choices 47 | 48 | class Choice(object): 49 | def __init__(self): 50 | if not value == None: 51 | self.label = _dict[value] 52 | self.value = value 53 | else: 54 | self.label = None 55 | self.value = None 56 | return Choice() -------------------------------------------------------------------------------- /ops/static/avatars/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar.png -------------------------------------------------------------------------------- /ops/static/avatars/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar1.png -------------------------------------------------------------------------------- /ops/static/avatars/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar2.png -------------------------------------------------------------------------------- /ops/static/avatars/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar3.png -------------------------------------------------------------------------------- /ops/static/avatars/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar4.png -------------------------------------------------------------------------------- /ops/static/avatars/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/avatar5.png -------------------------------------------------------------------------------- /ops/static/avatars/profile-pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/profile-pic.jpg -------------------------------------------------------------------------------- /ops/static/avatars/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/avatars/user.jpg -------------------------------------------------------------------------------- /ops/static/css/ace-ie.min.css: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | *left: 0 3 | } 4 | 5 | .sidebar:before { 6 | display: none 7 | } 8 | 9 | .ace-nav > li.white-opaque { 10 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#CCFFFFFF', endColorstr='#CCFFFFFF', GradientType=0) 11 | } 12 | 13 | .ace-nav > li.dark-opaque { 14 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33000000', endColorstr='#33000000', GradientType=0) 15 | } 16 | 17 | .infobox > .infobox-icon > [class*="icon-"]:before { 18 | color: #FFF 19 | } 20 | 21 | .infobox-dark > .badge { 22 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33FFFFFF', endColorstr='#33FFFFFF', GradientType=0) !important 23 | } 24 | 25 | .widget-box-overlay { 26 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#55000000', endColorstr='#55000000', GradientType=0) !important 27 | } 28 | 29 | .widget-toolbar-light { 30 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#D8FFFFFF', endColorstr='#D8FFFFFF', GradientType=0) !important 31 | } 32 | 33 | input[type=checkbox].ace, input[type=radio].ace { 34 | position: static; 35 | width: auto; 36 | height: auto; 37 | z-index: auto 38 | } 39 | 40 | input[type=checkbox].ace + .lbl, input[type=radio].ace + .lbl { 41 | min-height: auto; 42 | min-width: auto 43 | } 44 | 45 | input[type=checkbox].ace.ace-switch { 46 | width: auto 47 | } 48 | 49 | input[type=checkbox].ace.ace-switch + .lbl { 50 | margin: 0; 51 | min-height: auto 52 | } 53 | 54 | input[type=checkbox].ace.ace-switch-7 { 55 | width: auto 56 | } 57 | 58 | .ace-file-input input[type=file] { 59 | width: 100%; 60 | height: 30px; 61 | position: absolute; 62 | z-index: 1; 63 | filter: alpha(opacity=0); 64 | cursor: pointer 65 | } 66 | 67 | .ace-file-input input[type=file]:hover + .file-label { 68 | border-color: #f59942 69 | } 70 | 71 | .ace-file-multiple input[type=file] { 72 | height: 100% 73 | } 74 | 75 | .ace-file-input .remove { 76 | z-index: 2 77 | } 78 | 79 | .ace-file-input .file-label.selected .file-name { 80 | width: 50% 81 | } 82 | 83 | .ace-file-multiple .file-label.selected .file-name { 84 | width: auto 85 | } 86 | 87 | .wizard-steps li:first-child:before { 88 | max-width: 100%; 89 | left: 0 90 | } 91 | 92 | .login-layout .widget-box { 93 | display: none; 94 | visibility: visible; 95 | position: static 96 | } 97 | 98 | .login-layout .widget-box.visible { 99 | display: block 100 | } 101 | 102 | .pricing-box-small:hover { 103 | zoom: 1.04; 104 | left: -1px; 105 | top: -3px 106 | } 107 | 108 | .ace-thumbnails > li > a > img { 109 | width: auto !important 110 | } 111 | 112 | .ace-thumbnails > li > :first-child > .text { 113 | display: none 114 | } 115 | 116 | .ace-thumbnails > li:hover > :first-child > .text { 117 | display: block 118 | } 119 | 120 | .ace-thumbnails > li > .tools { 121 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8C000000', endColorstr='#8C000000', GradientType=0) !important 122 | } 123 | 124 | .ace-thumbnails > li > :first-child > .text { 125 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8C000000', endColorstr='#8C000000', GradientType=0) !important 126 | } 127 | 128 | #cboxLoadingGraphic > [class*="icon-"] { 129 | display: inline-block; 130 | background: #FFF url('images/loading.gif') no-repeat center 131 | } 132 | 133 | #cboxLoadingGraphic > [class*="icon-"]:before { 134 | display: none 135 | } 136 | 137 | .widget-box-overlay > [class*="icon-"] { 138 | display: inline-block; 139 | width: 24px; 140 | height: 24px; 141 | margin-left: 46%; 142 | background: transparent url('images/loading.gif') no-repeat center 143 | } 144 | 145 | .widget-box-overlay > [class*="icon-"]:before { 146 | display: none 147 | } 148 | 149 | .btn.btn-app.btn-light { 150 | border: 1px solid #d9d9d9 151 | } 152 | 153 | .btn.btn-app.btn-yellow { 154 | border: 1px solid #fee188 155 | } 156 | 157 | .grid3 { 158 | width: 31% 159 | } 160 | 161 | .grid4 { 162 | width: 23% 163 | } 164 | 165 | .itemdiv.dialogdiv > .body:before { 166 | display: none 167 | } 168 | 169 | .fc-event-hori, .fc-event-vert { 170 | border: none !important 171 | } 172 | 173 | [class*="tab-color-"] .nav-tabs > li > a > [class*="icon-"]:first-child { 174 | color: #666 !important 175 | } 176 | 177 | .dropdown-preview > .dropdown-menu { 178 | *width: 180px 179 | } 180 | 181 | .ui-datepicker, .ui-autocomplete, .ui-menu { 182 | border: 1px solid #CCC 183 | } 184 | 185 | .ui-widget-overlay { 186 | filter: alpha(opacity=100) !important; 187 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44000000', endColorstr='#44000000', GradientType=0) !important 188 | } 189 | 190 | .message-content { 191 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#CCFFFFFF', endColorstr='#CCFFFFFF', GradientType=0) !important 192 | } 193 | 194 | .gritter-item-wrapper { 195 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EA323232', endColorstr='#EA323232', GradientType=0) !important 196 | } 197 | 198 | .gritter-item-wrapper.gritter-info { 199 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EA315185', endColorstr='#EA315185', GradientType=0) !important 200 | } 201 | 202 | .gritter-item-wrapper.gritter-error { 203 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EA992812', endColorstr='#EA992812', GradientType=0) !important 204 | } 205 | 206 | .gritter-item-wrapper.gritter-success { 207 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EA59834B', endColorstr='#EA59834B', GradientType=0) !important 208 | } 209 | 210 | .gritter-item-wrapper.gritter-warning { 211 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EABE701F', endColorstr='#EABE701F', GradientType=0) !important 212 | } 213 | 214 | .gritter-item-wrapper.gritter-light { 215 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2F5F5F5', endColorstr='#F2F5F5F5', GradientType=0) !important 216 | } 217 | 218 | .gritter-info.gritter-light { 219 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2E8F2FF', endColorstr='#F2E8F2FF', GradientType=0) !important 220 | } 221 | 222 | .gritter-error.gritter-light { 223 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2FFEBEB', endColorstr='#F2FFEBEB', GradientType=0) !important 224 | } 225 | 226 | .gritter-success.gritter-light { 227 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2EFFAE3', endColorstr='#F2EFFAE3', GradientType=0) !important 228 | } 229 | 230 | .gritter-warning.gritter-light { 231 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2FCF8E3', endColorstr='#F2FCF8E3', GradientType=0) !important 232 | } 233 | 234 | .widget-header .wysiwyg-toolbar .btn-group > .btn, .widget-body .md-header .btn { 235 | background: transparent none !important; 236 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#40FFFFFF', endColorstr='#40FFFFFF', GradientType=0) !important 237 | } 238 | 239 | .widget-header .wysiwyg-toolbar .btn-group > .btn.active, .widget-body .md-header .btn-inverse { 240 | background: transparent none !important; 241 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#40000000', endColorstr='#40000000', GradientType=0) !important 242 | } 243 | 244 | .widget-body .md-header .btn, .widget-body .md-header .btn-inverse { 245 | display: none 246 | } 247 | 248 | body.skin-3, .skin-3 .sidebar { 249 | background-color: #d6d6d6 250 | } 251 | 252 | .skin-3 .menu-min .nav-list > li.active > a { 253 | background-color: #eef8ff 254 | } 255 | 256 | body.skin-2, .skin-2 .sidebar { 257 | background-color: #505050 258 | } 259 | 260 | .skin-2 .nav-list > li:hover > a > span { 261 | color: #FFF 262 | } 263 | 264 | .skin-2 .nav-list > li:hover > a > [class*="icon-"]:first-child { 265 | color: #FFF 266 | } 267 | 268 | .skin-2 .menu-min .nav-list > li > a:hover > [class*="icon-"]:first-child { 269 | color: #FFF 270 | } 271 | 272 | .rtl .nav-list li.active > a:after { 273 | border-left-color: transparent; 274 | border-right-color: #0b6cbc 275 | } 276 | 277 | .rtl.skin-1 .nav-list li.active > a:after { 278 | border-right-color: #FFF; 279 | border-left-color: transparent 280 | } 281 | 282 | .rtl.skin-1 .menu-min .nav-list li.active:hover > a:after { 283 | border-right-color: #242a2b 284 | } 285 | 286 | .rtl.skin-2 .nav-list li.active > a:after { 287 | border-right-color: #FFF; 288 | border-left-color: transparent 289 | } 290 | 291 | .rtl.skin-2 .menu-min .nav-list li.active:hover > a:after { 292 | border-right-color: #292929; 293 | border-left-color: transparent 294 | } 295 | 296 | .rtl.skin-2 .nav-list li.active.open > .submenu > li.active > a:after { 297 | border-right-color: #FFF; 298 | border-left-color: transparent 299 | } 300 | 301 | .rtl.skin-3 .nav-list li.active > a:after { 302 | border-right-color: #FFF; 303 | border-left-color: transparent 304 | } 305 | 306 | .rtl.skin-3 .nav-list li.active > a:before { 307 | border-right-color: #a4c6dd; 308 | border-left-color: transparent 309 | } -------------------------------------------------------------------------------- /ops/static/css/bootstrap-timepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | .bootstrap-timepicker { 12 | position: relative; 13 | } 14 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { 15 | left: auto; 16 | right: 0; 17 | } 18 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { 19 | left: auto; 20 | right: 12px; 21 | } 22 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { 23 | left: auto; 24 | right: 13px; 25 | } 26 | .bootstrap-timepicker .add-on { 27 | cursor: pointer; 28 | } 29 | .bootstrap-timepicker .add-on i { 30 | display: inline-block; 31 | width: 16px; 32 | height: 16px; 33 | } 34 | .bootstrap-timepicker-widget.dropdown-menu { 35 | padding: 2px 3px 2px 2px; 36 | } 37 | .bootstrap-timepicker-widget.dropdown-menu.open { 38 | display: inline-block; 39 | } 40 | .bootstrap-timepicker-widget.dropdown-menu:before { 41 | border-bottom: 7px solid rgba(0, 0, 0, 0.2); 42 | border-left: 7px solid transparent; 43 | border-right: 7px solid transparent; 44 | content: ""; 45 | display: inline-block; 46 | left: 9px; 47 | position: absolute; 48 | top: -7px; 49 | } 50 | .bootstrap-timepicker-widget.dropdown-menu:after { 51 | border-bottom: 6px solid #FFFFFF; 52 | border-left: 6px solid transparent; 53 | border-right: 6px solid transparent; 54 | content: ""; 55 | display: inline-block; 56 | left: 10px; 57 | position: absolute; 58 | top: -6px; 59 | } 60 | .bootstrap-timepicker-widget a.btn, 61 | .bootstrap-timepicker-widget input { 62 | border-radius: 4px; 63 | } 64 | .bootstrap-timepicker-widget table { 65 | width: 100%; 66 | margin: 0; 67 | } 68 | .bootstrap-timepicker-widget table td { 69 | text-align: center; 70 | height: 30px; 71 | margin: 0; 72 | padding: 2px; 73 | } 74 | .bootstrap-timepicker-widget table td:not(.separator) { 75 | min-width: 30px; 76 | } 77 | .bootstrap-timepicker-widget table td span { 78 | width: 100%; 79 | } 80 | .bootstrap-timepicker-widget table td a { 81 | border: 1px transparent solid; 82 | width: 100%; 83 | display: inline-block; 84 | margin: 0; 85 | padding: 8px 0; 86 | outline: 0; 87 | color: #333; 88 | } 89 | .bootstrap-timepicker-widget table td a:hover { 90 | text-decoration: none; 91 | background-color: #eee; 92 | -webkit-border-radius: 4px; 93 | -moz-border-radius: 4px; 94 | border-radius: 4px; 95 | border-color: #ddd; 96 | } 97 | .bootstrap-timepicker-widget table td a i { 98 | margin-top: 2px; 99 | } 100 | .bootstrap-timepicker-widget table td input { 101 | width: 25px; 102 | margin: 0; 103 | text-align: center; 104 | } 105 | .bootstrap-timepicker-widget .modal-content { 106 | padding: 4px; 107 | } 108 | @media (min-width: 767px) { 109 | .bootstrap-timepicker-widget.modal { 110 | width: 200px; 111 | margin-left: -100px; 112 | } 113 | } 114 | @media (max-width: 767px) { 115 | .bootstrap-timepicker { 116 | width: 100%; 117 | } 118 | .bootstrap-timepicker .dropdown-menu { 119 | width: 100%; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /ops/static/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/chosen-sprite.png -------------------------------------------------------------------------------- /ops/static/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /ops/static/css/colorbox.css: -------------------------------------------------------------------------------- 1 | /* 2 | Colorbox Core Style: 3 | The following CSS is consistent between example themes and should not be altered. 4 | */ 5 | #colorbox, #cboxOverlay, #cboxWrapper { 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | z-index: 9999; 10 | overflow: hidden; 11 | } 12 | 13 | #cboxOverlay { 14 | position: fixed; 15 | width: 100%; 16 | height: 100%; 17 | } 18 | 19 | #cboxMiddleLeft, #cboxBottomLeft { 20 | clear: left; 21 | } 22 | 23 | #cboxContent { 24 | position: relative; 25 | } 26 | 27 | #cboxLoadedContent { 28 | overflow: auto; 29 | -webkit-overflow-scrolling: touch; 30 | } 31 | 32 | #cboxTitle { 33 | margin: 0; 34 | } 35 | 36 | #cboxLoadingOverlay, #cboxLoadingGraphic { 37 | position: absolute; 38 | top: 0; 39 | left: 0; 40 | width: 100%; 41 | height: 100%; 42 | } 43 | 44 | #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow { 45 | cursor: pointer; 46 | } 47 | 48 | .cboxPhoto { 49 | float: left; 50 | margin: auto; 51 | border: 0; 52 | display: block; 53 | max-width: none; 54 | -ms-interpolation-mode: bicubic; 55 | } 56 | 57 | .cboxIframe { 58 | width: 100%; 59 | height: 100%; 60 | display: block; 61 | border: 0; 62 | } 63 | 64 | #colorbox, #cboxContent, #cboxLoadedContent { 65 | box-sizing: content-box; 66 | -moz-box-sizing: content-box; 67 | -webkit-box-sizing: content-box; 68 | } 69 | 70 | /* 71 | User Style: 72 | Change the following styles to modify the appearance of Colorbox. They are 73 | ordered & tabbed in a way that represents the nesting of the generated HTML. 74 | */ 75 | #cboxOverlay { 76 | background: url(images/overlay.png) repeat 0 0; 77 | } 78 | 79 | #colorbox { 80 | outline: 0; 81 | } 82 | 83 | #cboxTopLeft { 84 | width: 21px; 85 | height: 21px; 86 | background: url(images/controls.png) no-repeat -101px 0; 87 | } 88 | 89 | #cboxTopRight { 90 | width: 21px; 91 | height: 21px; 92 | background: url(images/controls.png) no-repeat -130px 0; 93 | } 94 | 95 | #cboxBottomLeft { 96 | width: 21px; 97 | height: 21px; 98 | background: url(images/controls.png) no-repeat -101px -29px; 99 | } 100 | 101 | #cboxBottomRight { 102 | width: 21px; 103 | height: 21px; 104 | background: url(images/controls.png) no-repeat -130px -29px; 105 | } 106 | 107 | #cboxMiddleLeft { 108 | width: 21px; 109 | background: url(images/controls.png) left top repeat-y; 110 | } 111 | 112 | #cboxMiddleRight { 113 | width: 21px; 114 | background: url(images/controls.png) right top repeat-y; 115 | } 116 | 117 | #cboxTopCenter { 118 | height: 21px; 119 | background: url(images/border.png) 0 0 repeat-x; 120 | } 121 | 122 | #cboxBottomCenter { 123 | height: 21px; 124 | background: url(images/border.png) 0 -29px repeat-x; 125 | } 126 | 127 | #cboxContent { 128 | background: #fff; 129 | overflow: hidden; 130 | } 131 | 132 | .cboxIframe { 133 | background: #fff; 134 | } 135 | 136 | #cboxError { 137 | padding: 50px; 138 | border: 1px solid #ccc; 139 | } 140 | 141 | #cboxLoadedContent { 142 | margin-bottom: 28px; 143 | } 144 | 145 | #cboxTitle { 146 | position: absolute; 147 | bottom: 4px; 148 | left: 0; 149 | text-align: center; 150 | width: 100%; 151 | color: #949494; 152 | } 153 | 154 | #cboxCurrent { 155 | position: absolute; 156 | bottom: 4px; 157 | left: 58px; 158 | color: #949494; 159 | } 160 | 161 | #cboxLoadingOverlay { 162 | background: url(images/loading_background.png) no-repeat center center; 163 | } 164 | 165 | #cboxLoadingGraphic { 166 | background: url(images/loading.gif) no-repeat center center; 167 | } 168 | 169 | /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ 170 | #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose { 171 | border: 0; 172 | padding: 0; 173 | margin: 0; 174 | overflow: visible; 175 | width: auto; 176 | background: none; 177 | } 178 | 179 | /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ 180 | #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active { 181 | outline: 0; 182 | } 183 | 184 | #cboxSlideshow { 185 | position: absolute; 186 | bottom: 4px; 187 | right: 30px; 188 | color: #0092ef; 189 | } 190 | 191 | #cboxPrevious { 192 | position: absolute; 193 | bottom: 0; 194 | left: 0; 195 | background: url(images/controls.png) no-repeat -75px 0; 196 | width: 25px; 197 | height: 25px; 198 | text-indent: -9999px; 199 | } 200 | 201 | #cboxPrevious:hover { 202 | background-position: -75px -25px; 203 | } 204 | 205 | #cboxNext { 206 | position: absolute; 207 | bottom: 0; 208 | left: 27px; 209 | background: url(images/controls.png) no-repeat -50px 0; 210 | width: 25px; 211 | height: 25px; 212 | text-indent: -9999px; 213 | } 214 | 215 | #cboxNext:hover { 216 | background-position: -50px -25px; 217 | } 218 | 219 | #cboxClose { 220 | position: absolute; 221 | bottom: 0; 222 | right: 0; 223 | background: url(images/controls.png) no-repeat -25px 0; 224 | width: 25px; 225 | height: 25px; 226 | text-indent: -9999px; 227 | } 228 | 229 | #cboxClose:hover { 230 | background-position: -25px -25px; 231 | } 232 | 233 | /* 234 | The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill 235 | when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9. 236 | See: http://jacklmoore.com/notes/ie-transparency-problems/ 237 | */ 238 | .cboxIE #cboxTopLeft, 239 | .cboxIE #cboxTopCenter, 240 | .cboxIE #cboxTopRight, 241 | .cboxIE #cboxBottomLeft, 242 | .cboxIE #cboxBottomCenter, 243 | .cboxIE #cboxBottomRight, 244 | .cboxIE #cboxMiddleLeft, 245 | .cboxIE #cboxMiddleRight { 246 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF, endColorstr=#00FFFFFF); 247 | } -------------------------------------------------------------------------------- /ops/static/css/colorpicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Colorpicker for Bootstrap 3 | * 4 | * Copyright 2012 Stefan Petre 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | */ 9 | .colorpicker-saturation { 10 | width: 100px; 11 | height: 100px; 12 | background-image: url(img/saturation.png); 13 | cursor: crosshair; 14 | float: left; 15 | } 16 | .colorpicker-saturation i { 17 | display: block; 18 | height: 5px; 19 | width: 5px; 20 | border: 1px solid #000; 21 | -webkit-border-radius: 5px; 22 | -moz-border-radius: 5px; 23 | border-radius: 5px; 24 | position: absolute; 25 | top: 0; 26 | left: 0; 27 | margin: -4px 0 0 -4px; 28 | } 29 | .colorpicker-saturation i b { 30 | display: block; 31 | height: 5px; 32 | width: 5px; 33 | border: 1px solid #fff; 34 | -webkit-border-radius: 5px; 35 | -moz-border-radius: 5px; 36 | border-radius: 5px; 37 | } 38 | .colorpicker-hue, .colorpicker-alpha { 39 | width: 15px; 40 | height: 100px; 41 | float: left; 42 | cursor: row-resize; 43 | margin-left: 4px; 44 | margin-bottom: 4px; 45 | } 46 | .colorpicker-hue i, .colorpicker-alpha i { 47 | display: block; 48 | height: 1px; 49 | background: #000; 50 | border-top: 1px solid #fff; 51 | position: absolute; 52 | top: 0; 53 | left: 0; 54 | width: 100%; 55 | margin-top: -1px; 56 | } 57 | .colorpicker-hue { 58 | background-image: url(img/hue.png); 59 | } 60 | .colorpicker-alpha { 61 | background-image: url(img/alpha.png); 62 | display: none; 63 | } 64 | .colorpicker { 65 | *zoom: 1; 66 | top: 0; 67 | left: 0; 68 | padding: 4px; 69 | min-width: 120px; 70 | margin-top: 1px; 71 | -webkit-border-radius: 4px; 72 | -moz-border-radius: 4px; 73 | border-radius: 4px; 74 | } 75 | .colorpicker:before, .colorpicker:after { 76 | display: table; 77 | content: ""; 78 | } 79 | .colorpicker:after { 80 | clear: both; 81 | } 82 | .colorpicker:before { 83 | content: ''; 84 | display: inline-block; 85 | border-left: 7px solid transparent; 86 | border-right: 7px solid transparent; 87 | border-bottom: 7px solid #ccc; 88 | border-bottom-color: rgba(0, 0, 0, 0.2); 89 | position: absolute; 90 | top: -7px; 91 | left: 6px; 92 | } 93 | .colorpicker:after { 94 | content: ''; 95 | display: inline-block; 96 | border-left: 6px solid transparent; 97 | border-right: 6px solid transparent; 98 | border-bottom: 6px solid #ffffff; 99 | position: absolute; 100 | top: -6px; 101 | left: 7px; 102 | } 103 | .colorpicker div { 104 | position: relative; 105 | } 106 | .colorpicker.alpha { 107 | min-width: 140px; 108 | } 109 | .colorpicker.alpha .colorpicker-alpha { 110 | display: block; 111 | } 112 | .colorpicker-color { 113 | height: 10px; 114 | margin-top: 5px; 115 | clear: both; 116 | background-image: url(img/alpha.png); 117 | background-position: 0 100%; 118 | } 119 | .colorpicker-color div { 120 | height: 10px; 121 | } 122 | .input-append.color .add-on i, .input-prepend.color .add-on i { 123 | display: block; 124 | cursor: pointer; 125 | width: 16px; 126 | height: 16px; 127 | } -------------------------------------------------------------------------------- /ops/static/css/dataTables.bootstrap.css: -------------------------------------------------------------------------------- 1 | div.dataTables_length label { 2 | font-weight: normal; 3 | float: left; 4 | text-align: left; 5 | } 6 | 7 | div.dataTables_length select { 8 | width: 75px; 9 | } 10 | 11 | div.dataTables_filter label { 12 | font-weight: normal; 13 | float: right; 14 | } 15 | 16 | div.dataTables_filter input { 17 | width: 16em; 18 | } 19 | 20 | div.dataTables_info { 21 | padding-top: 8px; 22 | } 23 | 24 | div.dataTables_paginate { 25 | float: right; 26 | margin: 0; 27 | } 28 | 29 | div.dataTables_paginate ul.pagination { 30 | margin: 2px 0; 31 | white-space: nowrap; 32 | } 33 | 34 | table.dataTable, 35 | table.dataTable td, 36 | table.dataTable th { 37 | -webkit-box-sizing: content-box; 38 | -moz-box-sizing: content-box; 39 | box-sizing: content-box; 40 | } 41 | 42 | 43 | table.dataTable { 44 | clear: both; 45 | margin-top: 6px !important; 46 | margin-bottom: 6px !important; 47 | max-width: none !important; 48 | } 49 | 50 | table.dataTable thead .sorting, 51 | table.dataTable thead .sorting_asc, 52 | table.dataTable thead .sorting_desc, 53 | table.dataTable thead .sorting_asc_disabled, 54 | table.dataTable thead .sorting_desc_disabled { 55 | cursor: pointer; 56 | } 57 | 58 | table.dataTable thead .sorting { background: url('../images/sort_both.png') no-repeat center right; } 59 | table.dataTable thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; } 60 | table.dataTable thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; } 61 | 62 | table.dataTable thead .sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; } 63 | table.dataTable thead .sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; } 64 | 65 | table.dataTable thead > tr > th { 66 | padding-left: 18px; 67 | padding-right: 18px; 68 | } 69 | 70 | table.dataTable th:active { 71 | outline: none; 72 | } 73 | 74 | /* Scrolling */ 75 | div.dataTables_scrollHead table { 76 | margin-bottom: 0 !important; 77 | border-bottom-left-radius: 0; 78 | border-bottom-right-radius: 0; 79 | } 80 | 81 | div.dataTables_scrollHead table thead tr:last-child th:first-child, 82 | div.dataTables_scrollHead table thead tr:last-child td:first-child { 83 | border-bottom-left-radius: 0 !important; 84 | border-bottom-right-radius: 0 !important; 85 | } 86 | 87 | div.dataTables_scrollBody table { 88 | border-top: none; 89 | margin-top: 0 !important; 90 | margin-bottom: 0 !important; 91 | } 92 | 93 | div.dataTables_scrollBody tbody tr:first-child th, 94 | div.dataTables_scrollBody tbody tr:first-child td { 95 | border-top: none; 96 | } 97 | 98 | div.dataTables_scrollFoot table { 99 | margin-top: 0 !important; 100 | border-top: none; 101 | } 102 | 103 | 104 | 105 | 106 | /* 107 | * TableTools styles 108 | */ 109 | .table tbody tr.active td, 110 | .table tbody tr.active th { 111 | background-color: #08C; 112 | color: white; 113 | } 114 | 115 | .table tbody tr.active:hover td, 116 | .table tbody tr.active:hover th { 117 | background-color: #0075b0 !important; 118 | } 119 | 120 | .table tbody tr.active a { 121 | color: white; 122 | } 123 | 124 | .table-striped tbody tr.active:nth-child(odd) td, 125 | .table-striped tbody tr.active:nth-child(odd) th { 126 | background-color: #017ebc; 127 | } 128 | 129 | table.DTTT_selectable tbody tr { 130 | cursor: pointer; 131 | } 132 | 133 | div.DTTT .btn { 134 | color: #333 !important; 135 | font-size: 12px; 136 | } 137 | 138 | div.DTTT .btn:hover { 139 | text-decoration: none !important; 140 | } 141 | 142 | ul.DTTT_dropdown.dropdown-menu { 143 | z-index: 2003; 144 | } 145 | 146 | ul.DTTT_dropdown.dropdown-menu a { 147 | color: #333 !important; /* needed only when demo_page.css is included */ 148 | } 149 | 150 | ul.DTTT_dropdown.dropdown-menu li { 151 | position: relative; 152 | } 153 | 154 | ul.DTTT_dropdown.dropdown-menu li:hover a { 155 | background-color: #0088cc; 156 | color: white !important; 157 | } 158 | 159 | div.DTTT_collection_background { 160 | z-index: 2002; 161 | } 162 | 163 | /* TableTools information display */ 164 | div.DTTT_print_info.modal { 165 | height: 150px; 166 | margin-top: -75px; 167 | text-align: center; 168 | } 169 | 170 | div.DTTT_print_info h6 { 171 | font-weight: normal; 172 | font-size: 28px; 173 | line-height: 28px; 174 | margin: 1em; 175 | } 176 | 177 | div.DTTT_print_info p { 178 | font-size: 14px; 179 | line-height: 20px; 180 | } 181 | 182 | 183 | 184 | /* 185 | * FixedColumns styles 186 | */ 187 | div.DTFC_LeftHeadWrapper table, 188 | div.DTFC_LeftFootWrapper table, 189 | div.DTFC_RightHeadWrapper table, 190 | div.DTFC_RightFootWrapper table, 191 | table.DTFC_Cloned tr.even { 192 | background-color: white; 193 | margin-bottom: 0; 194 | } 195 | 196 | div.DTFC_RightHeadWrapper table , 197 | div.DTFC_LeftHeadWrapper table { 198 | margin-bottom: 0 !important; 199 | border-top-right-radius: 0 !important; 200 | border-bottom-left-radius: 0 !important; 201 | border-bottom-right-radius: 0 !important; 202 | } 203 | 204 | div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, 205 | div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, 206 | div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, 207 | div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { 208 | border-bottom-left-radius: 0 !important; 209 | border-bottom-right-radius: 0 !important; 210 | } 211 | 212 | div.DTFC_RightBodyWrapper table, 213 | div.DTFC_LeftBodyWrapper table { 214 | border-top: none; 215 | margin-bottom: 0 !important; 216 | } 217 | 218 | div.DTFC_RightBodyWrapper tbody tr:first-child th, 219 | div.DTFC_RightBodyWrapper tbody tr:first-child td, 220 | div.DTFC_LeftBodyWrapper tbody tr:first-child th, 221 | div.DTFC_LeftBodyWrapper tbody tr:first-child td { 222 | border-top: none; 223 | } 224 | 225 | div.DTFC_RightFootWrapper table, 226 | div.DTFC_LeftFootWrapper table { 227 | border-top: none; 228 | } 229 | -------------------------------------------------------------------------------- /ops/static/css/daterangepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x 3 | * 4 | * Copyright 2013 Dan Grossman ( http://www.dangrossman.info ) 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Built for http://www.improvely.com 9 | */ 10 | 11 | .daterangepicker.dropdown-menu { 12 | max-width: none; 13 | } 14 | 15 | .daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { 16 | float: left; 17 | margin: 4px; 18 | } 19 | 20 | .daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar { 21 | float: right; 22 | margin: 4px; 23 | } 24 | 25 | .daterangepicker .ranges { 26 | width: 160px; 27 | text-align: left; 28 | } 29 | 30 | .daterangepicker .ranges .range_inputs > div { 31 | float: left; 32 | } 33 | 34 | .daterangepicker .ranges .range_inputs > div:nth-child(2) { 35 | padding-left: 11px; 36 | } 37 | 38 | .daterangepicker .calendar { 39 | display: none; 40 | max-width: 270px; 41 | } 42 | 43 | .daterangepicker .calendar th, .daterangepicker .calendar td { 44 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 45 | white-space: nowrap; 46 | text-align: center; 47 | min-width: 32px; 48 | } 49 | 50 | .daterangepicker .ranges label { 51 | color: #333; 52 | display: block; 53 | font-size: 11px; 54 | font-weight: normal; 55 | height: 20px; 56 | line-height: 20px; 57 | margin-bottom: 2px; 58 | text-shadow: #fff 1px 1px 0px; 59 | text-transform: uppercase; 60 | width: 74px; 61 | } 62 | 63 | .daterangepicker .ranges input { 64 | font-size: 11px; 65 | } 66 | 67 | .daterangepicker .ranges .input-mini { 68 | background-color: #eee; 69 | border: 1px solid #ccc; 70 | border-radius: 4px; 71 | color: #555; 72 | display: block; 73 | font-size: 11px; 74 | height: 30px; 75 | line-height: 30px; 76 | vertical-align: middle; 77 | margin: 0 0 10px 0; 78 | padding: 0 6px; 79 | width: 74px; 80 | } 81 | 82 | .daterangepicker .ranges ul { 83 | list-style: none; 84 | margin: 0; 85 | padding: 0; 86 | } 87 | 88 | .daterangepicker .ranges li { 89 | font-size: 13px; 90 | background: #f5f5f5; 91 | border: 1px solid #f5f5f5; 92 | color: #08c; 93 | padding: 3px 12px; 94 | margin-bottom: 8px; 95 | -webkit-border-radius: 5px; 96 | -moz-border-radius: 5px; 97 | border-radius: 5px; 98 | cursor: pointer; 99 | } 100 | 101 | .daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { 102 | background: #08c; 103 | border: 1px solid #08c; 104 | color: #fff; 105 | } 106 | 107 | .daterangepicker .calendar-date { 108 | border: 1px solid #ddd; 109 | padding: 4px; 110 | border-radius: 4px; 111 | background: #fff; 112 | } 113 | 114 | .daterangepicker .calendar-time { 115 | text-align: center; 116 | margin: 8px auto 0 auto; 117 | line-height: 30px; 118 | } 119 | 120 | .daterangepicker { 121 | position: absolute; 122 | background: #fff; 123 | top: 100px; 124 | left: 20px; 125 | padding: 4px; 126 | margin-top: 1px; 127 | -webkit-border-radius: 4px; 128 | -moz-border-radius: 4px; 129 | border-radius: 4px; 130 | } 131 | 132 | .daterangepicker.opensleft:before { 133 | position: absolute; 134 | top: -7px; 135 | right: 9px; 136 | display: inline-block; 137 | border-right: 7px solid transparent; 138 | border-bottom: 7px solid #ccc; 139 | border-left: 7px solid transparent; 140 | border-bottom-color: rgba(0, 0, 0, 0.2); 141 | content: ''; 142 | } 143 | 144 | .daterangepicker.opensleft:after { 145 | position: absolute; 146 | top: -6px; 147 | right: 10px; 148 | display: inline-block; 149 | border-right: 6px solid transparent; 150 | border-bottom: 6px solid #fff; 151 | border-left: 6px solid transparent; 152 | content: ''; 153 | } 154 | 155 | .daterangepicker.opensright:before { 156 | position: absolute; 157 | top: -7px; 158 | left: 9px; 159 | display: inline-block; 160 | border-right: 7px solid transparent; 161 | border-bottom: 7px solid #ccc; 162 | border-left: 7px solid transparent; 163 | border-bottom-color: rgba(0, 0, 0, 0.2); 164 | content: ''; 165 | } 166 | 167 | .daterangepicker.opensright:after { 168 | position: absolute; 169 | top: -6px; 170 | left: 10px; 171 | display: inline-block; 172 | border-right: 6px solid transparent; 173 | border-bottom: 6px solid #fff; 174 | border-left: 6px solid transparent; 175 | content: ''; 176 | } 177 | 178 | .daterangepicker table { 179 | width: 100%; 180 | margin: 0; 181 | } 182 | 183 | .daterangepicker td, .daterangepicker th { 184 | text-align: center; 185 | width: 20px; 186 | height: 20px; 187 | -webkit-border-radius: 4px; 188 | -moz-border-radius: 4px; 189 | border-radius: 4px; 190 | cursor: pointer; 191 | white-space: nowrap; 192 | } 193 | 194 | .daterangepicker td.off { 195 | color: #999; 196 | } 197 | 198 | .daterangepicker td.disabled { 199 | color: #999; 200 | } 201 | 202 | .daterangepicker td.available:hover, .daterangepicker th.available:hover { 203 | background: #eee; 204 | } 205 | 206 | .daterangepicker td.in-range { 207 | background: #ebf4f8; 208 | -webkit-border-radius: 0; 209 | -moz-border-radius: 0; 210 | border-radius: 0; 211 | } 212 | 213 | .daterangepicker td.active, .daterangepicker td.active:hover { 214 | background-color: #357ebd; 215 | border-color: #3071a9; 216 | color: #fff; 217 | } 218 | 219 | .daterangepicker td.week, .daterangepicker th.week { 220 | font-size: 80%; 221 | color: #ccc; 222 | } 223 | 224 | .daterangepicker select.monthselect, .daterangepicker select.yearselect { 225 | font-size: 12px; 226 | padding: 1px; 227 | height: auto; 228 | margin: 0; 229 | cursor: default; 230 | } 231 | 232 | .daterangepicker select.monthselect { 233 | margin-right: 2%; 234 | width: 56%; 235 | } 236 | 237 | .daterangepicker select.yearselect { 238 | width: 40%; 239 | } 240 | 241 | .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { 242 | width: 50px; 243 | margin-bottom: 0; 244 | } -------------------------------------------------------------------------------- /ops/static/css/googleapis.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Open Sans'; 4 | font-style: normal; 5 | font-weight: 300; 6 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OX-hpKKSTj5PW.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Open Sans'; 12 | font-style: normal; 13 | font-weight: 300; 14 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OVuhpKKSTj5PW.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Open Sans'; 20 | font-style: normal; 21 | font-weight: 300; 22 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OXuhpKKSTj5PW.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Open Sans'; 28 | font-style: normal; 29 | font-weight: 300; 30 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OUehpKKSTj5PW.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Open Sans'; 36 | font-style: normal; 37 | font-weight: 300; 38 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OXehpKKSTj5PW.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Open Sans'; 44 | font-style: normal; 45 | font-weight: 300; 46 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OXOhpKKSTj5PW.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Open Sans'; 52 | font-style: normal; 53 | font-weight: 300; 54 | src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v15/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 56 | } 57 | /* cyrillic-ext */ 58 | @font-face { 59 | font-family: 'Open Sans'; 60 | font-style: normal; 61 | font-weight: 400; 62 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFWJ0bf8pkAp6a.woff2) format('woff2'); 63 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 64 | } 65 | /* cyrillic */ 66 | @font-face { 67 | font-family: 'Open Sans'; 68 | font-style: normal; 69 | font-weight: 400; 70 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFUZ0bf8pkAp6a.woff2) format('woff2'); 71 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 72 | } 73 | /* greek-ext */ 74 | @font-face { 75 | font-family: 'Open Sans'; 76 | font-style: normal; 77 | font-weight: 400; 78 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFWZ0bf8pkAp6a.woff2) format('woff2'); 79 | unicode-range: U+1F00-1FFF; 80 | } 81 | /* greek */ 82 | @font-face { 83 | font-family: 'Open Sans'; 84 | font-style: normal; 85 | font-weight: 400; 86 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFVp0bf8pkAp6a.woff2) format('woff2'); 87 | unicode-range: U+0370-03FF; 88 | } 89 | /* vietnamese */ 90 | @font-face { 91 | font-family: 'Open Sans'; 92 | font-style: normal; 93 | font-weight: 400; 94 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFWp0bf8pkAp6a.woff2) format('woff2'); 95 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 96 | } 97 | /* latin-ext */ 98 | @font-face { 99 | font-family: 'Open Sans'; 100 | font-style: normal; 101 | font-weight: 400; 102 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFW50bf8pkAp6a.woff2) format('woff2'); 103 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 104 | } 105 | /* latin */ 106 | @font-face { 107 | font-family: 'Open Sans'; 108 | font-style: normal; 109 | font-weight: 400; 110 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/mem8YaGs126MiZpBA-UFVZ0bf8pkAg.woff2) format('woff2'); 111 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 112 | } -------------------------------------------------------------------------------- /ops/static/css/googleapis_bak.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Open Sans Light'), local('OpenSans-Light'), url(http://themes.googleusercontent.com/static/fonts/opensans/v7/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); 6 | } 7 | 8 | @font-face { 9 | font-family: 'Open Sans'; 10 | font-style: normal; 11 | font-weight: 400; 12 | src: local('Open Sans'), local('OpenSans'), url(http://themes.googleusercontent.com/static/fonts/opensans/v7/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); 13 | } 14 | -------------------------------------------------------------------------------- /ops/static/css/images/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/images/border.png -------------------------------------------------------------------------------- /ops/static/css/images/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/images/controls.png -------------------------------------------------------------------------------- /ops/static/css/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/images/loading.gif -------------------------------------------------------------------------------- /ops/static/css/images/loading_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/images/loading_background.png -------------------------------------------------------------------------------- /ops/static/css/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/images/overlay.png -------------------------------------------------------------------------------- /ops/static/css/img/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/img/Thumbs.db -------------------------------------------------------------------------------- /ops/static/css/img/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/img/alpha.png -------------------------------------------------------------------------------- /ops/static/css/img/hue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/img/hue.png -------------------------------------------------------------------------------- /ops/static/css/img/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/img/saturation.png -------------------------------------------------------------------------------- /ops/static/css/jquery-ui-1.10.3.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.3 - 2013-07-07 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css 4 | * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ 5 | 6 | .ui-helper-hidden { 7 | display: none 8 | } 9 | 10 | .ui-helper-hidden-accessible { 11 | border: 0; 12 | clip: rect(0 0 0 0); 13 | height: 1px; 14 | margin: -1px; 15 | overflow: hidden; 16 | padding: 0; 17 | position: absolute; 18 | width: 1px 19 | } 20 | 21 | .ui-helper-reset { 22 | margin: 0; 23 | padding: 0; 24 | border: 0; 25 | outline: 0; 26 | line-height: 1.3; 27 | text-decoration: none; 28 | font-size: 100%; 29 | list-style: none 30 | } 31 | 32 | .ui-helper-clearfix:before, .ui-helper-clearfix:after { 33 | content: ""; 34 | display: table; 35 | border-collapse: collapse 36 | } 37 | 38 | .ui-helper-clearfix:after { 39 | clear: both 40 | } 41 | 42 | .ui-helper-clearfix { 43 | min-height: 0 44 | } 45 | 46 | .ui-helper-zfix { 47 | width: 100%; 48 | height: 100%; 49 | top: 0; 50 | left: 0; 51 | position: absolute; 52 | opacity: 0; 53 | filter: Alpha(Opacity=0) 54 | } 55 | 56 | .ui-front { 57 | z-index: 100 58 | } 59 | 60 | .ui-state-disabled { 61 | cursor: default !important 62 | } 63 | 64 | .ui-icon { 65 | display: block; 66 | text-indent: -99999px; 67 | overflow: hidden; 68 | background-repeat: no-repeat 69 | } 70 | 71 | .ui-widget-overlay { 72 | position: fixed; 73 | top: 0; 74 | left: 0; 75 | width: 100%; 76 | height: 100% 77 | } 78 | 79 | .ui-resizable { 80 | position: relative 81 | } 82 | 83 | .ui-resizable-handle { 84 | position: absolute; 85 | font-size: .1px; 86 | display: block 87 | } 88 | 89 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { 90 | display: none 91 | } 92 | 93 | .ui-resizable-n { 94 | cursor: n-resize; 95 | height: 7px; 96 | width: 100%; 97 | top: -5px; 98 | left: 0 99 | } 100 | 101 | .ui-resizable-s { 102 | cursor: s-resize; 103 | height: 7px; 104 | width: 100%; 105 | bottom: -5px; 106 | left: 0 107 | } 108 | 109 | .ui-resizable-e { 110 | cursor: e-resize; 111 | width: 7px; 112 | right: -5px; 113 | top: 0; 114 | height: 100% 115 | } 116 | 117 | .ui-resizable-w { 118 | cursor: w-resize; 119 | width: 7px; 120 | left: -5px; 121 | top: 0; 122 | height: 100% 123 | } 124 | 125 | .ui-resizable-se { 126 | cursor: se-resize; 127 | width: 12px; 128 | height: 12px; 129 | right: 1px; 130 | bottom: 1px 131 | } 132 | 133 | .ui-resizable-sw { 134 | cursor: sw-resize; 135 | width: 9px; 136 | height: 9px; 137 | left: -5px; 138 | bottom: -5px 139 | } 140 | 141 | .ui-resizable-nw { 142 | cursor: nw-resize; 143 | width: 9px; 144 | height: 9px; 145 | left: -5px; 146 | top: -5px 147 | } 148 | 149 | .ui-resizable-ne { 150 | cursor: ne-resize; 151 | width: 9px; 152 | height: 9px; 153 | right: -5px; 154 | top: -5px 155 | } 156 | 157 | .ui-selectable-helper { 158 | position: absolute; 159 | z-index: 100; 160 | border: 1px dotted #000 161 | } 162 | 163 | .ui-slider { 164 | position: relative; 165 | text-align: left 166 | } 167 | 168 | .ui-slider .ui-slider-handle { 169 | position: absolute; 170 | z-index: 2; 171 | width: 1.2em; 172 | height: 1.2em; 173 | cursor: default 174 | } 175 | 176 | .ui-slider .ui-slider-range { 177 | position: absolute; 178 | z-index: 1; 179 | font-size: .7em; 180 | display: block; 181 | border: 0; 182 | background-position: 0 0 183 | } 184 | 185 | .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { 186 | filter: inherit 187 | } 188 | 189 | .ui-slider-horizontal { 190 | height: .8em 191 | } 192 | 193 | .ui-slider-horizontal .ui-slider-handle { 194 | top: -.3em; 195 | margin-left: -.6em 196 | } 197 | 198 | .ui-slider-horizontal .ui-slider-range { 199 | top: 0; 200 | height: 100% 201 | } 202 | 203 | .ui-slider-horizontal .ui-slider-range-min { 204 | left: 0 205 | } 206 | 207 | .ui-slider-horizontal .ui-slider-range-max { 208 | right: 0 209 | } 210 | 211 | .ui-slider-vertical { 212 | width: .8em; 213 | height: 100px 214 | } 215 | 216 | .ui-slider-vertical .ui-slider-handle { 217 | left: -.3em; 218 | margin-left: 0; 219 | margin-bottom: -.6em 220 | } 221 | 222 | .ui-slider-vertical .ui-slider-range { 223 | left: 0; 224 | width: 100% 225 | } 226 | 227 | .ui-slider-vertical .ui-slider-range-min { 228 | bottom: 0 229 | } 230 | 231 | .ui-slider-vertical .ui-slider-range-max { 232 | top: 0 233 | } -------------------------------------------------------------------------------- /ops/static/css/jquery.gritter.css: -------------------------------------------------------------------------------- 1 | /* the norm */ 2 | #gritter-notice-wrapper { 3 | position: fixed; 4 | top: 20px; 5 | right: 20px; 6 | width: 301px; 7 | z-index: 9999; 8 | } 9 | 10 | #gritter-notice-wrapper.top-left { 11 | left: 20px; 12 | right: auto; 13 | } 14 | 15 | #gritter-notice-wrapper.bottom-right { 16 | top: auto; 17 | left: auto; 18 | bottom: 20px; 19 | right: 20px; 20 | } 21 | 22 | #gritter-notice-wrapper.bottom-left { 23 | top: auto; 24 | right: auto; 25 | bottom: 20px; 26 | left: 20px; 27 | } 28 | 29 | .gritter-item-wrapper { 30 | position: relative; 31 | margin: 0 0 10px 0; 32 | background: url('../images/ie-spacer.gif'); /* ie7/8 fix */ 33 | } 34 | 35 | .gritter-top { 36 | background: url(../images/gritter.png) no-repeat left -30px; 37 | height: 10px; 38 | } 39 | 40 | .hover .gritter-top { 41 | background-position: right -30px; 42 | } 43 | 44 | .gritter-bottom { 45 | background: url(../images/gritter.png) no-repeat left bottom; 46 | height: 8px; 47 | margin: 0; 48 | } 49 | 50 | .hover .gritter-bottom { 51 | background-position: bottom right; 52 | } 53 | 54 | .gritter-item { 55 | display: block; 56 | background: url(../images/gritter.png) no-repeat left -40px; 57 | color: #eee; 58 | padding: 2px 11px 8px 11px; 59 | font-size: 11px; 60 | font-family: verdana; 61 | } 62 | 63 | .hover .gritter-item { 64 | background-position: right -40px; 65 | } 66 | 67 | .gritter-item p { 68 | padding: 0; 69 | margin: 0; 70 | word-wrap: break-word; 71 | } 72 | 73 | .gritter-close { 74 | display: none; 75 | position: absolute; 76 | top: 5px; 77 | left: 3px; 78 | background: url(../images/gritter.png) no-repeat left top; 79 | cursor: pointer; 80 | width: 30px; 81 | height: 30px; 82 | } 83 | 84 | .gritter-title { 85 | font-size: 14px; 86 | font-weight: bold; 87 | padding: 0 0 7px 0; 88 | display: block; 89 | text-shadow: 1px 1px 0 #000; /* Not supported by IE :( */ 90 | } 91 | 92 | .gritter-image { 93 | width: 48px; 94 | height: 48px; 95 | float: left; 96 | } 97 | 98 | .gritter-with-image, 99 | .gritter-without-image { 100 | padding: 0; 101 | } 102 | 103 | .gritter-with-image { 104 | width: 220px; 105 | float: right; 106 | } 107 | 108 | /* for the light (white) version of the gritter notice */ 109 | .gritter-light .gritter-item, 110 | .gritter-light .gritter-bottom, 111 | .gritter-light .gritter-top, 112 | .gritter-light .gritter-close { 113 | background-image: url(../images/gritter-light.png); 114 | color: #222; 115 | } 116 | 117 | .gritter-light .gritter-title { 118 | text-shadow: none; 119 | } 120 | -------------------------------------------------------------------------------- /ops/static/css/prettify.css: -------------------------------------------------------------------------------- 1 | .com { 2 | color: #93a1a1; 3 | } 4 | 5 | .lit { 6 | color: #195f91; 7 | } 8 | 9 | .pun, .opn, .clo { 10 | color: #93a1a1; 11 | } 12 | 13 | .fun { 14 | color: #dc322f; 15 | } 16 | 17 | .str, .atv { 18 | color: #D14; 19 | } 20 | 21 | .kwd, .prettyprint .tag { 22 | color: #1e347b; 23 | } 24 | 25 | .typ, .atn, .dec, .var { 26 | color: teal; 27 | } 28 | 29 | .pln { 30 | color: #48484c; 31 | } 32 | 33 | .prettyprint { 34 | padding: 8px; 35 | background-color: #f7f7f9; 36 | border: 1px solid #e1e1e8; 37 | } 38 | 39 | .prettyprint.linenums { 40 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 41 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 42 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 43 | } 44 | 45 | /* Specify class=linenums on a pre to get line numbering */ 46 | ol.linenums { 47 | margin: 0 0 0 33px; /* IE indents via margin-left */ 48 | } 49 | 50 | ol.linenums li { 51 | padding-left: 12px; 52 | color: #bebec5; 53 | line-height: 20px; 54 | text-shadow: 0 1px 0 #fff; 55 | } -------------------------------------------------------------------------------- /ops/static/css/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/select2-spinner.gif -------------------------------------------------------------------------------- /ops/static/css/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/select2.png -------------------------------------------------------------------------------- /ops/static/css/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/css/select2x2.png -------------------------------------------------------------------------------- /ops/static/font/fontawesome-webfont-iefix.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/font/fontawesome-webfont-iefix.eot -------------------------------------------------------------------------------- /ops/static/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /ops/static/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /ops/static/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /ops/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /ops/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /ops/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-1.jpg -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-2.jpg -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-3.jpg -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-4.jpg -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-5.jpg -------------------------------------------------------------------------------- /ops/static/images/gallery/thumb-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/gallery/thumb-6.jpg -------------------------------------------------------------------------------- /ops/static/images/spritemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/spritemap.png -------------------------------------------------------------------------------- /ops/static/images/spritemap@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/images/spritemap@2x.png -------------------------------------------------------------------------------- /ops/static/img/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/img/clear.png -------------------------------------------------------------------------------- /ops/static/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BackPotMan/iamdc/7ff6b951831a0bc30bfb182bd6c7ea345694e46c/ops/static/img/loading.gif -------------------------------------------------------------------------------- /ops/static/js/ace-extra.min.js: -------------------------------------------------------------------------------- 1 | if(!("ace" in window)){window.ace={}}ace.config={cookie_expiry:604800,storage_method:2};ace.settings={is:function(b,a){return(ace.data.get("settings",b+"-"+a)==1)},exists:function(b,a){return(ace.data.get("settings",b+"-"+a)!==null)},set:function(b,a){ace.data.set("settings",b+"-"+a,1)},unset:function(b,a){ace.data.set("settings",b+"-"+a,-1)},remove:function(b,a){ace.data.remove("settings",b+"-"+a)},navbar_fixed:function(a){a=a||false;if(!a&&ace.settings.is("sidebar","fixed")){ace.settings.sidebar_fixed(false)}var b=document.getElementById("navbar");if(a){if(!ace.hasClass(b,"navbar-fixed-top")){ace.addClass(b,"navbar-fixed-top")}if(!ace.hasClass(document.body,"navbar-fixed")){ace.addClass(document.body,"navbar-fixed")}ace.settings.set("navbar","fixed")}else{ace.removeClass(b,"navbar-fixed-top");ace.removeClass(document.body,"navbar-fixed");ace.settings.unset("navbar","fixed")}document.getElementById("ace-settings-navbar").checked=a},breadcrumbs_fixed:function(a){a=a||false;if(a&&!ace.settings.is("sidebar","fixed")){ace.settings.sidebar_fixed(true)}var b=document.getElementById("breadcrumbs");if(a){if(!ace.hasClass(b,"breadcrumbs-fixed")){ace.addClass(b,"breadcrumbs-fixed")}if(!ace.hasClass(document.body,"breadcrumbs-fixed")){ace.addClass(document.body,"breadcrumbs-fixed")}ace.settings.set("breadcrumbs","fixed")}else{ace.removeClass(b,"breadcrumbs-fixed");ace.removeClass(document.body,"breadcrumbs-fixed");ace.settings.unset("breadcrumbs","fixed")}document.getElementById("ace-settings-breadcrumbs").checked=a},sidebar_fixed:function(a){a=a||false;if(!a&&ace.settings.is("breadcrumbs","fixed")){ace.settings.breadcrumbs_fixed(false)}if(a&&!ace.settings.is("navbar","fixed")){ace.settings.navbar_fixed(true)}var b=document.getElementById("sidebar");if(a){if(!ace.hasClass(b,"sidebar-fixed")){ace.addClass(b,"sidebar-fixed")}ace.settings.set("sidebar","fixed")}else{ace.removeClass(b,"sidebar-fixed");ace.settings.unset("sidebar","fixed")}document.getElementById("ace-settings-sidebar").checked=a},main_container_fixed:function(a){a=a||false;var c=document.getElementById("main-container");var b=document.getElementById("navbar-container");if(a){if(!ace.hasClass(c,"container")){ace.addClass(c,"container")}if(!ace.hasClass(b,"container")){ace.addClass(b,"container")}ace.settings.set("main-container","fixed")}else{ace.removeClass(c,"container");ace.removeClass(b,"container");ace.settings.unset("main-container","fixed")}document.getElementById("ace-settings-add-container").checked=a;if(navigator.userAgent.match(/webkit/i)){var d=document.getElementById("sidebar");ace.toggleClass(d,"menu-min");setTimeout(function(){ace.toggleClass(d,"menu-min")},0)}},sidebar_collapsed:function(c){c=c||false;var e=document.getElementById("sidebar");var d=document.getElementById("sidebar-collapse").querySelector('[class*="icon-"]');var b=d.getAttribute("data-icon1");var a=d.getAttribute("data-icon2");if(c){ace.addClass(e,"menu-min");ace.removeClass(d,b);ace.addClass(d,a);ace.settings.set("sidebar","collapsed")}else{ace.removeClass(e,"menu-min");ace.removeClass(d,a);ace.addClass(d,b);ace.settings.unset("sidebar","collapsed")}},};ace.settings.check=function(c,e){if(!ace.settings.exists(c,e)){return}var a=ace.settings.is(c,e);var b={"navbar-fixed":"navbar-fixed-top","sidebar-fixed":"sidebar-fixed","breadcrumbs-fixed":"breadcrumbs-fixed","sidebar-collapsed":"menu-min","main-container-fixed":"container"};var d=document.getElementById(c);if(a!=ace.hasClass(d,b[c+"-"+e])){ace.settings[c.replace("-","_")+"_"+e](a)}};ace.data_storage=function(e,c){var b="ace.";var d=null;var a=0;if((e==1||e===c)&&"localStorage" in window&&window.localStorage!==null){d=ace.storage;a=1}else{if(d==null&&(e==2||e===c)&&"cookie" in document&&document.cookie!==null){d=ace.cookie;a=2}}this.set=function(h,g,i,k){if(!d){return}if(i===k){i=g;g=h;if(i==null){d.remove(b+g)}else{if(a==1){d.set(b+g,i)}else{if(a==2){d.set(b+g,i,ace.config.cookie_expiry)}}}}else{if(a==1){if(i==null){d.remove(b+h+"."+g)}else{d.set(b+h+"."+g,i)}}else{if(a==2){var j=d.get(b+h);var f=j?JSON.parse(j):{};if(i==null){delete f[g];if(ace.sizeof(f)==0){d.remove(b+h);return}}else{f[g]=i}d.set(b+h,JSON.stringify(f),ace.config.cookie_expiry)}}}};this.get=function(h,g,j){if(!d){return null}if(g===j){g=h;return d.get(b+g)}else{if(a==1){return d.get(b+h+"."+g)}else{if(a==2){var i=d.get(b+h);var f=i?JSON.parse(i):{};return g in f?f[g]:null}}}};this.remove=function(g,f,h){if(!d){return}if(f===h){f=g;this.set(f,null)}else{this.set(g,f,null)}}};ace.cookie={get:function(c){var d=document.cookie,g,f=c+"=",a;if(!d){return}a=d.indexOf("; "+f);if(a==-1){a=d.indexOf(f);if(a!=0){return null}}else{a+=2}g=d.indexOf(";",a);if(g==-1){g=d.length}return decodeURIComponent(d.substring(a+f.length,g))},set:function(b,e,a,g,c,f){var h=new Date();if(typeof(a)=="object"&&a.toGMTString){a=a.toGMTString()}else{if(parseInt(a,10)){h.setTime(h.getTime()+(parseInt(a,10)*1000));a=h.toGMTString()}else{a=""}}document.cookie=b+"="+encodeURIComponent(e)+((a)?"; expires="+a:"")+((g)?"; path="+g:"")+((c)?"; domain="+c:"")+((f)?"; secure":"")},remove:function(a,b){this.set(a,"",-1000,b)}};ace.storage={get:function(a){return window.localStorage.getItem(a)},set:function(a,b){window.localStorage.setItem(a,b)},remove:function(a){window.localStorage.removeItem(a)}};ace.sizeof=function(c){var b=0;for(var a in c){if(c.hasOwnProperty(a)){b++}}return b};ace.hasClass=function(b,a){return(" "+b.className+" ").indexOf(" "+a+" ")>-1};ace.addClass=function(c,b){if(!ace.hasClass(c,b)){var a=c.className;c.className=a+(a.length?" ":"")+b}};ace.removeClass=function(b,a){ace.replaceClass(b,a)};ace.replaceClass=function(c,b,d){var a=new RegExp(("(^|\\s)"+b+"(\\s|$)"),"i");c.className=c.className.replace(a,function(e,g,f){return d?(g+d+f):" "}).replace(/^\s+|\s+$/g,"")};ace.toggleClass=function(b,a){if(ace.hasClass(b,a)){ace.removeClass(b,a)}else{ace.addClass(b,a)}};ace.data=new ace.data_storage(ace.config.storage_method); -------------------------------------------------------------------------------- /ops/static/js/ace.min.js: -------------------------------------------------------------------------------- 1 | if(!("ace" in window)){window.ace={}}jQuery(function(a){window.ace.click_event=a.fn.tap?"tap":"click"});jQuery(function(a){ace.handle_side_menu(jQuery);ace.enable_search_ahead(jQuery);ace.general_things(jQuery);ace.widget_boxes(jQuery);ace.widget_reload_handler(jQuery)});ace.handle_side_menu=function(a){a("#menu-toggler").on(ace.click_event,function(){a("#sidebar").toggleClass("display");a(this).toggleClass("display");return false});var c=a("#sidebar").hasClass("menu-min");a("#sidebar-collapse").on(ace.click_event,function(){c=a("#sidebar").hasClass("menu-min");ace.settings.sidebar_collapsed(!c)});var b=navigator.userAgent.match(/OS (5|6|7)(_\d)+ like Mac OS X/i);a(".nav-list").on(ace.click_event,function(h){var g=a(h.target).closest("a");if(!g||g.length==0){return}c=a("#sidebar").hasClass("menu-min");if(!g.hasClass("dropdown-toggle")){if(c&&ace.click_event=="tap"&&g.get(0).parentNode.parentNode==this){var i=g.find(".menu-text").get(0);if(h.target!=i&&!a.contains(i,h.target)){return false}}if(b){document.location=g.attr("href");return false}return}var f=g.next().get(0);if(!a(f).is(":visible")){var d=a(f.parentNode).closest("ul");if(c&&d.hasClass("nav-list")){return}d.find("> .open > .submenu").each(function(){if(this!=f&&!a(this.parentNode).hasClass("active")){a(this).slideUp(200).parent().removeClass("open")}})}else{}if(c&&a(f.parentNode.parentNode).hasClass("nav-list")){return false}a(f).slideToggle(200).parent().toggleClass("open");return false})};ace.general_things=function(a){a('.ace-nav [class*="icon-animated-"]').closest("a").on("click",function(){var d=a(this).find('[class*="icon-animated-"]').eq(0);var c=d.attr("class").match(/icon\-animated\-([\d\w]+)/);d.removeClass(c[0]);a(this).off("click")});a(".nav-list .badge[title],.nav-list .label[title]").tooltip({placement:"right"});a("#ace-settings-btn").on(ace.click_event,function(){a(this).toggleClass("open");a("#ace-settings-box").toggleClass("open")});a("#ace-settings-navbar").on("click",function(){ace.settings.navbar_fixed(this.checked)}).each(function(){this.checked=ace.settings.is("navbar","fixed")});a("#ace-settings-sidebar").on("click",function(){ace.settings.sidebar_fixed(this.checked)}).each(function(){this.checked=ace.settings.is("sidebar","fixed")});a("#ace-settings-breadcrumbs").on("click",function(){ace.settings.breadcrumbs_fixed(this.checked)}).each(function(){this.checked=ace.settings.is("breadcrumbs","fixed")});a("#ace-settings-add-container").on("click",function(){ace.settings.main_container_fixed(this.checked)}).each(function(){this.checked=ace.settings.is("main-container","fixed")});a("#ace-settings-rtl").removeAttr("checked").on("click",function(){ace.switch_direction(jQuery)});a("#btn-scroll-up").on(ace.click_event,function(){var c=Math.min(400,Math.max(100,parseInt(a("html").scrollTop()/3)));a("html,body").animate({scrollTop:0},c);return false});try{a("#skin-colorpicker").ace_colorpicker()}catch(b){}a("#skin-colorpicker").on("change",function(){var d=a(this).find("option:selected").data("skin");var c=a(document.body);c.removeClass("skin-1 skin-2 skin-3");if(d!="default"){c.addClass(d)}if(d=="skin-1"){a(".ace-nav > li.grey").addClass("dark")}else{a(".ace-nav > li.grey").removeClass("dark")}if(d=="skin-2"){a(".ace-nav > li").addClass("no-border margin-1");a(".ace-nav > li:not(:last-child)").addClass("light-pink").find('> a > [class*="icon-"]').addClass("pink").end().eq(0).find(".badge").addClass("badge-warning")}else{a(".ace-nav > li").removeClass("no-border margin-1");a(".ace-nav > li:not(:last-child)").removeClass("light-pink").find('> a > [class*="icon-"]').removeClass("pink").end().eq(0).find(".badge").removeClass("badge-warning")}if(d=="skin-3"){a(".ace-nav > li.grey").addClass("red").find(".badge").addClass("badge-yellow")}else{a(".ace-nav > li.grey").removeClass("red").find(".badge").removeClass("badge-yellow")}})};ace.widget_boxes=function(a){a(document).on("hide.bs.collapse show.bs.collapse",function(c){var b=c.target.getAttribute("id");a('[href*="#'+b+'"]').find('[class*="icon-"]').each(function(){var e=a(this);var d;var f=null;var g=null;if((f=e.attr("data-icon-show"))){g=e.attr("data-icon-hide")}else{if(d=e.attr("class").match(/icon\-(.*)\-(up|down)/)){f="icon-"+d[1]+"-down";g="icon-"+d[1]+"-up"}}if(f){if(c.type=="show"){e.removeClass(f).addClass(g)}else{e.removeClass(g).addClass(f)}return false}})});a(document).on("click.ace.widget","[data-action]",function(o){o.preventDefault();var n=a(this);var p=n.data("action");var b=n.closest(".widget-box");if(b.hasClass("ui-sortable-helper")){return}if(p=="collapse"){var j=b.hasClass("collapsed")?"show":"hide";var f=j=="show"?"shown":"hidden";var c;b.trigger(c=a.Event(j+".ace.widget"));if(c.isDefaultPrevented()){return}var g=b.find(".widget-body");var m=n.find("[class*=icon-]").eq(0);var h=m.attr("class").match(/icon\-(.*)\-(up|down)/);var d="icon-"+h[1]+"-down";var i="icon-"+h[1]+"-up";var l=g.find(".widget-body-inner");if(l.length==0){g=g.wrapInner('
').find(":first-child").eq(0)}else{g=l.eq(0)}var e=300;var k=200;if(j=="show"){if(m){m.addClass(i).removeClass(d)}b.removeClass("collapsed");g.slideUp(0,function(){g.slideDown(e,function(){b.trigger(c=a.Event(f+".ace.widget"))})})}else{if(m){m.addClass(d).removeClass(i)}g.slideUp(k,function(){b.addClass("collapsed");b.trigger(c=a.Event(f+".ace.widget"))})}}else{if(p=="close"){var c;b.trigger(c=a.Event("close.ace.widget"));if(c.isDefaultPrevented()){return}var r=parseInt(n.data("close-speed"))||300;b.hide(r,function(){b.trigger(c=a.Event("closed.ace.widget"));b.remove()})}else{if(p=="reload"){var c;b.trigger(c=a.Event("reload.ace.widget"));if(c.isDefaultPrevented()){return}n.blur();var q=false;if(b.css("position")=="static"){q=true;b.addClass("position-relative")}b.append('
');b.one("reloaded.ace.widget",function(){b.find(".widget-box-overlay").remove();if(q){b.removeClass("position-relative")}})}else{if(p=="settings"){var c=a.Event("settings.ace.widget");b.trigger(c)}}}}})};ace.widget_reload_handler=function(a){a(document).on("reload.ace.widget",".widget-box",function(b){var c=a(this);setTimeout(function(){c.trigger("reloaded.ace.widget")},parseInt(Math.random()*1000+1000))})};ace.enable_search_ahead=function(a){ace.variable_US_STATES=["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Dakota","North Carolina","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"];try{a("#nav-search-input").typeahead({source:ace.variable_US_STATES,updater:function(c){a("#nav-search-input").focus();return c}})}catch(b){}};ace.switch_direction=function(d){var c=d(document.body);c.toggleClass("rtl").find(".dropdown-menu:not(.datepicker-dropdown,.colorpicker)").toggleClass("pull-right").end().find(".pull-right:not(.dropdown-menu,blockquote,.profile-skills .pull-right)").removeClass("pull-right").addClass("tmp-rtl-pull-right").end().find(".pull-left:not(.dropdown-submenu,.profile-skills .pull-left)").removeClass("pull-left").addClass("pull-right").end().find(".tmp-rtl-pull-right").removeClass("tmp-rtl-pull-right").addClass("pull-left").end().find(".chosen-container").toggleClass("chosen-rtl").end();function a(h,g){c.find("."+h).removeClass(h).addClass("tmp-rtl-"+h).end().find("."+g).removeClass(g).addClass(h).end().find(".tmp-rtl-"+h).removeClass("tmp-rtl-"+h).addClass(g)}function b(h,g,i){i.each(function(){var k=d(this);var j=k.css(g);k.css(g,k.css(h));k.css(h,j)})}a("align-left","align-right");a("no-padding-left","no-padding-right");a("arrowed","arrowed-right");a("arrowed-in","arrowed-in-right");a("messagebar-item-left","messagebar-item-right");var e=d("#piechart-placeholder");if(e.size()>0){var f=d(document.body).hasClass("rtl")?"nw":"ne";e.data("draw").call(e.get(0),e,e.data("chart"),f)}}; -------------------------------------------------------------------------------- /ops/static/js/bootbox.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * bootbox.js v4.0.0 3 | * 4 | * http://bootboxjs.com/license.txt 5 | */ 6 | window.bootbox=window.bootbox||function a(b,c){"use strict";function d(a){var b=s[q.locale];return b?b[a]:s.en[a]}function e(a,c,d){a.preventDefault();var e=b.isFunction(d)&&d(a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},q,a),a.buttons||(a.buttons={}),a.backdrop=a.backdrop?"static":!1,c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c){return n(j(m.apply(null,a),b,c),a)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(){return{buttons:l.apply(null,arguments)}}function n(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var o={dialog:"",header:"",footer:"",closeButton:"",form:"
",inputs:{text:""}},p=b("body"),q={locale:"en",backdrop:!0,animate:!0,className:null,closeButton:!0,show:!0},r={};r.alert=function(){var a;if(a=k(["ok"],arguments,["message","callback"]),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback():!0},r.dialog(a)},r.confirm=function(){var a;if(a=k(["cancel","confirm"],arguments,["message","callback"]),a.buttons.cancel.callback=a.onEscape=function(){return a.callback(!1)},a.buttons.confirm.callback=function(){return a.callback(!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return r.dialog(a)},r.prompt=function(){var a,d,e,f,g,h;if(f=b(o.form),d={buttons:l("cancel","confirm"),value:""},a=n(j(d,arguments,["title","callback"]),["cancel","confirm"]),h=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback(null)},a.buttons.confirm.callback=function(){return a.callback(g.val())},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");return g=b(o.inputs.text),g.val(a.value),f.append(g),f.on("submit",function(a){a.preventDefault(),e.find(".btn-primary").click()}),e=r.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){g.focus()}),h===!0&&e.modal("show"),e},r.dialog=function(a){a=h(a);var c=b(o.dialog),d=c.find(".modal-body"),f=a.buttons,i="",j={onEscape:a.onEscape};if(g(f,function(a,b){i+="",j[a]=b.callback}),d.find(".bootbox-body").html(a.message),a.animate===!0&&c.addClass("fade"),a.className&&c.addClass(a.className),a.title&&d.before(o.header),a.closeButton){var k=b(o.closeButton);a.title?c.find(".modal-header").prepend(k):k.css("margin-top","-10px").prependTo(d)}return a.title&&c.find(".modal-title").html(a.title),i.length&&(d.after(o.footer),c.find(".modal-footer").html(i)),c.on("hidden.bs.modal",function(a){a.target===this&&c.remove()}),c.on("shown.bs.modal",function(){c.find(".btn-primary:first").focus()}),c.on("escape.close.bb",function(a){j.onEscape&&e(a,c,j.onEscape)}),c.on("click",".modal-footer button",function(a){var d=b(this).data("bb-handler");e(a,c,j[d])}),c.on("click",".bootbox-close-button",function(a){e(a,c,j.onEscape)}),c.on("keyup",function(a){27===a.which&&c.trigger("escape.close.bb")}),p.append(c),c.modal({backdrop:a.backdrop,keyboard:!1,show:!1}),a.show&&c.modal("show"),c},r.setDefaults=function(a){b.extend(q,a)},r.hideAll=function(){b(".bootbox").modal("hide")};var s={br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return r.init=function(c){window.bootbox=a(c||b)},r}(window.jQuery); -------------------------------------------------------------------------------- /ops/static/js/bootstrap-tag.min.js: -------------------------------------------------------------------------------- 1 | !function(c){var b=function(e,d){this.element=c(e);this.options=c.extend(true,{},c.fn.tag.defaults,d);this.values=c.grep(c.map(this.element.val().split(","),c.trim),function(f){return f.length>0});this.show()};b.prototype={constructor:b,show:function(){var d=this;d.element.parent().prepend(d.element.detach().hide());d.element.wrap(c('
')).parent().on("click",function(){d.input.focus()});if(d.values.length){c.each(d.values,function(){d.createBadge(this)})}d.input=c('').attr("placeholder",d.options.placeholder).insertAfter(d.element).on("focus",function(){d.element.parent().addClass("tags-hover")}).on("blur",function(){if(!d.skip){d.process();d.element.parent().removeClass("tags-hover");d.element.siblings(".tag").removeClass("tag-important")}d.skip=false}).on("keydown",function(g){if(g.keyCode==188||g.keyCode==13||g.keyCode==9){if(c.trim(c(this).val())&&(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden"))){if(g.keyCode!=9){g.preventDefault()}d.process()}else{if(g.keyCode==188){if(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden")){g.preventDefault()}else{d.input.data("typeahead").select();g.stopPropagation();g.preventDefault()}}}}else{if(!c.trim(c(this).val())&&g.keyCode==8){var f=d.element.siblings(".tag").length;if(f){var e=d.element.siblings(".tag:eq("+(f-1)+")");if(e.hasClass("tag-important")){d.remove(f-1)}else{e.addClass("tag-important")}}}else{d.element.siblings(".tag").removeClass("tag-important")}}}).typeahead({source:d.options.source,matcher:function(e){return ~e.toLowerCase().indexOf(this.query.toLowerCase())&&(d.inValues(e)==-1||d.options.allowDuplicates)},updater:c.proxy(d.add,d)});c(d.input.data("typeahead").$menu).on("mousedown",function(){d.skip=true});this.element.trigger("shown")},inValues:function(e){if(this.options.caseInsensitive){var d=-1;c.each(this.values,function(f,g){if(g.toLowerCase()==e.toLowerCase()){d=f;return false}});return d}else{return c.inArray(e,this.values)}},createBadge:function(e){var d=this;c("",{"class":"tag"}).text(e).append(c('').on("click",function(){d.remove(d.element.siblings(".tag").index(c(this).closest(".tag")))})).insertBefore(d.element)},add:function(g){var f=this;if(!f.options.allowDuplicates){var e=f.inValues(g);if(e!=-1){var d=f.element.siblings(".tag:eq("+e+")");d.addClass("tag-warning");setTimeout(function(){c(d).removeClass("tag-warning")},500);return}}this.values.push(g);this.createBadge(g);this.element.val(this.values.join(", "));this.element.trigger("added",[g])},remove:function(d){if(d>=0){var e=this.values.splice(d,1);this.element.siblings(".tag:eq("+d+")").remove();this.element.val(this.values.join(", "));this.element.trigger("removed",[e])}},process:function(){var d=c.grep(c.map(this.input.val().split(","),c.trim),function(f){return f.length>0}),e=this;c.each(d,function(){e.add(this)});this.input.val("")},skip:false};var a=c.fn.tag;c.fn.tag=function(d){return this.each(function(){var f=c(this),g=f.data("tag"),e=typeof d=="object"&&d;if(!g){f.data("tag",(g=new b(this,e)))}if(typeof d=="string"){g[d]()}})};c.fn.tag.defaults={allowDuplicates:false,caseInsensitive:true,placeholder:"",source:[]};c.fn.tag.Constructor=b;c.fn.tag.noConflict=function(){c.fn.tag=a;return this};c(window).on("load",function(){c('[data-provide="tag"]').each(function(){var d=c(this);if(d.data("tag")){return}d.tag(d.data())})})}(window.jQuery); -------------------------------------------------------------------------------- /ops/static/js/bootstrap-wysiwyg.min.js: -------------------------------------------------------------------------------- 1 | (function(b){var a=function(e){var c=b.Deferred(),d=new FileReader();d.onload=function(f){c.resolve(f.target.result)};d.onerror=c.reject;d.onprogress=c.notify;d.readAsDataURL(e);return c.promise()};b.fn.cleanHtml=function(){var c=b(this).html();return c&&c.replace(/(
|\s|

<\/div>| )*$/,"")};b.fn.wysiwyg=function(k){var l=this,h,q,d,p=function(){if(q.activeToolbarClass){b(q.toolbarSelector).find(d).each(function(){try{var s=b(this).data(q.commandRole);if(document.queryCommandState(s)){b(this).addClass(q.activeToolbarClass)}else{b(this).removeClass(q.activeToolbarClass)}}catch(r){}})}},o=function(r,s){var u=r.split(" "),v=u.shift(),t=u.join(" ")+(s||"");document.execCommand(v,0,t);p()},f=function(r){b.each(r,function(s,t){l.keydown(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation();o(t)}}).keyup(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation()}})})},g=function(){try{var r=window.getSelection();if(r.getRangeAt&&r.rangeCount){return r.getRangeAt(0)}}catch(s){}},i=function(){h=g()},e=function(){try{var s=window.getSelection();if(h){try{s.removeAllRanges()}catch(r){document.body.createTextRange().select();document.selection.empty()}s.addRange(h)}}catch(t){}},j=function(r){l.focus();b.each(r,function(s,t){if(/^image\//.test(t.type)){b.when(a(t)).done(function(u){o("insertimage",u)}).fail(function(u){q.fileUploadError("file-reader",u)})}else{q.fileUploadError("unsupported-file-type",t.type)}})},c=function(s,r){e();if(document.queryCommandSupported("hiliteColor")){document.execCommand("hiliteColor",0,r||"transparent")}i();s.data(q.selectionMarker,r)},m=function(s,r){s.find(d).click(function(){e();l.focus();o(b(this).data(r.commandRole));i()});s.find("[data-toggle=dropdown]").click(e);s.find("input[type=text][data-"+r.commandRole+"]").on("webkitspeechchange change",function(){var t=this.value;this.value="";e();if(t){l.focus();o(b(this).data(r.commandRole),t)}i()}).on("focus",function(){var t=b(this);if(!t.data(r.selectionMarker)){c(t,r.selectionColor);t.focus()}}).on("blur",function(){var t=b(this);if(t.data(r.selectionMarker)){c(t,false)}});s.find("input[type=file][data-"+r.commandRole+"]").change(function(){e();if(this.type==="file"&&this.files&&this.files.length>0){j(this.files)}i();this.value=""})},n=function(){l.on("dragenter dragover",false).on("drop",function(s){var r=s.originalEvent.dataTransfer;s.stopPropagation();s.preventDefault();if(r&&r.files&&r.files.length>0){j(r.files)}})};q=b.extend({},b.fn.wysiwyg.defaults,k);d="a[data-"+q.commandRole+"],button[data-"+q.commandRole+"],input[type=button][data-"+q.commandRole+"]";f(q.hotKeys);if(q.dragAndDropImages){n()}m(b(q.toolbarSelector),q);l.attr("contenteditable",true).on("mouseup keyup mouseout",function(){i();p()});b(window).bind("touchend",function(u){var t=(l.is(u.target)||l.has(u.target).length>0),s=g(),r=s&&(s.startContainer===s.endContainer&&s.startOffset===s.endOffset);if(!r||t){i();p()}});return this};b.fn.wysiwyg.defaults={hotKeys:{"ctrl+b meta+b":"bold","ctrl+i meta+i":"italic","ctrl+u meta+u":"underline","ctrl+z meta+z":"undo","ctrl+y meta+y meta+shift+z":"redo","ctrl+l meta+l":"justifyleft","ctrl+r meta+r":"justifyright","ctrl+e meta+e":"justifycenter","ctrl+j meta+j":"justifyfull","shift+tab":"outdent",tab:"indent"},toolbarSelector:"[data-role=editor-toolbar]",commandRole:"edit",activeToolbarClass:"btn-info",selectionMarker:"edit-focus-marker",selectionColor:"darkgrey",dragAndDropImages:true,fileUploadError:function(d,c){console.log("File upload error",d,c)}}}(window.jQuery)); -------------------------------------------------------------------------------- /ops/static/js/customize.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | // 添加审核人 4 | function addreviewer(obj){ 5 | if($(obj).prev().is("select")){ 6 | var preval = $(obj).prev().val(); 7 | }else if($(obj).prev().is("span")){ 8 | var preval = $(obj).prev().find(".reviewer").val(); 9 | } 10 | var hasboss = false; 11 | $(".reviewer").each(function(){ 12 | if($(this).val() == "-1"){ 13 | hasboss = true; 14 | } 15 | }) 16 | if(hasboss == true){ //如果前面出现了上级领导 那么后面只能是指定人选了 17 | var len = $(".reviewer").length; 18 | $(obj).before(''); 19 | getreviewer($("#reviewer_"+len)); 20 | }else{ 21 | $(obj).before('') 22 | } 23 | if($(obj).next().is("a")) { 24 | }else{ 25 | $(obj).after('删除一级') 26 | } 27 | } 28 | 29 | // 删除一级 30 | function delReviewer(obj){ 31 | if($(obj).prev().prev().is("span") && $(obj).prev().prev().prev().is("select")){ 32 | $(obj).prev().prev().remove(); 33 | $(obj).remove(); 34 | }else if($(obj).prev().prev().is("span") && $(obj).prev().prev().prev().is("span")){ 35 | $(obj).prev().prev().remove(); 36 | } 37 | if($(obj).prev().prev().hasClass("firstreviewer")){ 38 | $(obj).remove(); 39 | } 40 | } 41 | 42 | 43 | // 获取审核人名单 44 | function getreviewer(obj){ 45 | alert("xx"); 46 | $.ajax({ 47 | url: '/tickettype/', 48 | type: "POST", 49 | dataType: "json", 50 | data:{'type':"getreviewer"}, 51 | error: function () { 52 | }, 53 | success: function (data) { 54 | alert(data); 55 | // var oplist = new Array(); 56 | // for (var i = 0; i < data.count; i++) { 57 | // var _info = data.items[i]; 58 | // oplist.push(''); 59 | // } 60 | // if(obj.parent().hasClass('firstleader')){ 61 | // var len = 0; 62 | // }else{ 63 | // var len= $(".sureLeaderAuth_select").length; 64 | // } 65 | // obj.parent().html((obj.parent().hasClass('firstleader') ? '':'') +''); 66 | // $("#sureLeaderAuth_select_"+len).select2(); 67 | // $("#jNotify").click(); 68 | // oplist = null; 69 | } 70 | }); 71 | 72 | } 73 | 74 | //获取审核指定审核人名单 75 | function changeReviewer(obj){ 76 | if($(obj).val() == "-2"){ 77 | getreviewer($(obj)); 78 | } 79 | } 80 | 81 | 82 | //固定人员的选择后操作 83 | function sureLeaderAuth(obj){ 84 | $(obj).parent().html(($(obj).parent().hasClass('firstleader') ? '':'') +''+$(obj).find("option:selected").text()+''); 85 | } 86 | 87 | // 编辑工单类型 88 | function show_edit_modal(){ 89 | 90 | } 91 | 92 | 93 | // 94 | function add(){ 95 | 96 | var reviewerarr =[]; 97 | $(".reviewer").each(function(){ 98 | if($(this).is('select')){ 99 | leadersarr.push($(this).val()); 100 | }else if($(this).is('span')){ 101 | leadersarr.push($(this).attr('reviewerid')); 102 | } 103 | }) 104 | var reviewer = reviewerarr.join(','); 105 | 106 | } 107 | 108 | 109 | -------------------------------------------------------------------------------- /ops/static/js/dataTables.bootstrap.js: -------------------------------------------------------------------------------- 1 | /* Set the defaults for DataTables initialisation */ 2 | $.extend( true, $.fn.dataTable.defaults, { 3 | "sDom": 4 | "<'row'<'col-xs-6'l><'col-xs-6'f>r>"+ 5 | "t"+ 6 | "<'row'<'col-xs-6'i><'col-xs-6'p>>", 7 | "oLanguage": { 8 | "sLengthMenu": "_MENU_ records per page" 9 | } 10 | } ); 11 | 12 | 13 | /* Default class modification */ 14 | $.extend( $.fn.dataTableExt.oStdClasses, { 15 | "sWrapper": "dataTables_wrapper form-inline", 16 | "sFilterInput": "form-control input-sm", 17 | "sLengthSelect": "form-control input-sm" 18 | } ); 19 | 20 | // In 1.10 we use the pagination renderers to draw the Bootstrap paging, 21 | // rather than custom plug-in 22 | if ( $.fn.dataTable.Api ) { 23 | $.fn.dataTable.defaults.renderer = 'bootstrap'; 24 | $.fn.dataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { 25 | var api = new $.fn.dataTable.Api( settings ); 26 | var classes = settings.oClasses; 27 | var lang = settings.oLanguage.oPaginate; 28 | var btnDisplay, btnClass; 29 | 30 | var attach = function( container, buttons ) { 31 | var i, ien, node, button; 32 | var clickHandler = function ( e ) { 33 | e.preventDefault(); 34 | if ( e.data.action !== 'ellipsis' ) { 35 | api.page( e.data.action ).draw( false ); 36 | } 37 | }; 38 | 39 | for ( i=0, ien=buttons.length ; i 0 ? 58 | '' : ' disabled'); 59 | break; 60 | 61 | case 'previous': 62 | btnDisplay = lang.sPrevious; 63 | btnClass = button + (page > 0 ? 64 | '' : ' disabled'); 65 | break; 66 | 67 | case 'next': 68 | btnDisplay = lang.sNext; 69 | btnClass = button + (page < pages-1 ? 70 | '' : ' disabled'); 71 | break; 72 | 73 | case 'last': 74 | btnDisplay = lang.sLast; 75 | btnClass = button + (page < pages-1 ? 76 | '' : ' disabled'); 77 | break; 78 | 79 | default: 80 | btnDisplay = button + 1; 81 | btnClass = page === button ? 82 | 'active' : ''; 83 | break; 84 | } 85 | 86 | if ( btnDisplay ) { 87 | node = $('
  • ', { 88 | 'class': classes.sPageButton+' '+btnClass, 89 | 'aria-controls': settings.sTableId, 90 | 'tabindex': settings.iTabIndex, 91 | 'id': idx === 0 && typeof button === 'string' ? 92 | settings.sTableId +'_'+ button : 93 | null 94 | } ) 95 | .append( $('', { 96 | 'href': '#' 97 | } ) 98 | .html( btnDisplay ) 99 | ) 100 | .appendTo( container ); 101 | 102 | settings.oApi._fnBindAction( 103 | node, {action: button}, clickHandler 104 | ); 105 | } 106 | } 107 | } 108 | }; 109 | 110 | attach( 111 | $(host).empty().html('
      ').children('ul'), 112 | buttons 113 | ); 114 | } 115 | } 116 | else { 117 | // Integration for 1.9- 118 | $.fn.dataTable.defaults.sPaginationType = 'bootstrap'; 119 | 120 | /* API method to get paging information */ 121 | $.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings ) 122 | { 123 | return { 124 | "iStart": oSettings._iDisplayStart, 125 | "iEnd": oSettings.fnDisplayEnd(), 126 | "iLength": oSettings._iDisplayLength, 127 | "iTotal": oSettings.fnRecordsTotal(), 128 | "iFilteredTotal": oSettings.fnRecordsDisplay(), 129 | "iPage": oSettings._iDisplayLength === -1 ? 130 | 0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ), 131 | "iTotalPages": oSettings._iDisplayLength === -1 ? 132 | 0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength ) 133 | }; 134 | }; 135 | 136 | /* Bootstrap style pagination control */ 137 | $.extend( $.fn.dataTableExt.oPagination, { 138 | "bootstrap": { 139 | "fnInit": function( oSettings, nPaging, fnDraw ) { 140 | var oLang = oSettings.oLanguage.oPaginate; 141 | var fnClickHandler = function ( e ) { 142 | e.preventDefault(); 143 | if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) { 144 | fnDraw( oSettings ); 145 | } 146 | }; 147 | 148 | $(nPaging).append( 149 | '' 153 | ); 154 | var els = $('a', nPaging); 155 | $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler ); 156 | $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler ); 157 | }, 158 | 159 | "fnUpdate": function ( oSettings, fnDraw ) { 160 | var iListLength = 5; 161 | var oPaging = oSettings.oInstance.fnPagingInfo(); 162 | var an = oSettings.aanFeatures.p; 163 | var i, ien, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2); 164 | 165 | if ( oPaging.iTotalPages < iListLength) { 166 | iStart = 1; 167 | iEnd = oPaging.iTotalPages; 168 | } 169 | else if ( oPaging.iPage <= iHalf ) { 170 | iStart = 1; 171 | iEnd = iListLength; 172 | } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) { 173 | iStart = oPaging.iTotalPages - iListLength + 1; 174 | iEnd = oPaging.iTotalPages; 175 | } else { 176 | iStart = oPaging.iPage - iHalf + 1; 177 | iEnd = iStart + iListLength - 1; 178 | } 179 | 180 | for ( i=0, ien=an.length ; i'+j+'') 188 | .insertBefore( $('li:last', an[i])[0] ) 189 | .bind('click', function (e) { 190 | e.preventDefault(); 191 | oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength; 192 | fnDraw( oSettings ); 193 | } ); 194 | } 195 | 196 | // Add / remove disabled classes from the static elements 197 | if ( oPaging.iPage === 0 ) { 198 | $('li:first', an[i]).addClass('disabled'); 199 | } else { 200 | $('li:first', an[i]).removeClass('disabled'); 201 | } 202 | 203 | if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) { 204 | $('li:last', an[i]).addClass('disabled'); 205 | } else { 206 | $('li:last', an[i]).removeClass('disabled'); 207 | } 208 | } 209 | } 210 | } 211 | } ); 212 | } 213 | 214 | 215 | /* 216 | * TableTools Bootstrap compatibility 217 | * Required TableTools 2.1+ 218 | */ 219 | if ( $.fn.DataTable.TableTools ) { 220 | // Set the classes that TableTools uses to something suitable for Bootstrap 221 | $.extend( true, $.fn.DataTable.TableTools.classes, { 222 | "container": "DTTT btn-group", 223 | "buttons": { 224 | "normal": "btn btn-default", 225 | "disabled": "disabled" 226 | }, 227 | "collection": { 228 | "container": "DTTT_dropdown dropdown-menu", 229 | "buttons": { 230 | "normal": "", 231 | "disabled": "disabled" 232 | } 233 | }, 234 | "print": { 235 | "info": "DTTT_print_info modal" 236 | }, 237 | "select": { 238 | "row": "active" 239 | } 240 | } ); 241 | 242 | // Have the collection use a bootstrap compatible dropdown 243 | $.extend( true, $.fn.DataTable.TableTools.DEFAULTS.oTags, { 244 | "collection": { 245 | "container": "ul", 246 | "button": "li", 247 | "liner": "a" 248 | } 249 | } ); 250 | } 251 | 252 | -------------------------------------------------------------------------------- /ops/static/js/flot/jquery.flot.resize.min.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | *//* Inline dependency: 13 | * jQuery resize event - v1.1 - 3/14/2010 14 | * http://benalman.com/projects/jquery-resize-plugin/ 15 | * 16 | * Copyright (c) 2010 "Cowboy" Ben Alman 17 | * Dual licensed under the MIT and GPL licenses. 18 | * http://benalman.com/about/license/ 19 | */(function(e,t,n){function c(){s=t[o](function(){r.each(function(){var t=e(this),n=t.width(),r=t.height(),i=e.data(this,a);(n!==i.w||r!==i.h)&&t.trigger(u,[i.w=n,i.h=r])}),c()},i[f])}var r=e([]),i=e.resize=e.extend(e.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="throttleWindow";i[f]=250,i[l]=!0,e.event.special[u]={setup:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.add(t),e.data(this,a,{w:t.width(),h:t.height()}),r.length===1&&c()},teardown:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.not(t),t.removeData(a),r.length||clearTimeout(s)},add:function(t){function s(t,i,s){var o=e(this),u=e.data(this,a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[l]&&this[o])return!1;var r;if(e.isFunction(t))return r=t,s;r=t.handler,t.handler=s}}})(jQuery,this),function(e){function n(e){function t(){var t=e.getPlaceholder();if(t.width()==0||t.height()==0)return;e.resize(),e.setupGrid(),e.draw()}function n(e,n){e.getPlaceholder().resize(t)}function r(e,n){e.getPlaceholder().unbind("resize",t)}e.hooks.bindEvents.push(n),e.hooks.shutdown.push(r)}var t={};e.plot.plugins.push({init:n,options:t,name:"resize",version:"1.0"})}(jQuery); -------------------------------------------------------------------------------- /ops/static/js/fuelux/data/fuelux.tree-sampledata.js: -------------------------------------------------------------------------------- 1 | var DataSourceTree = function(options) { 2 | this._data = options.data; 3 | this._delay = options.delay; 4 | } 5 | 6 | DataSourceTree.prototype.data = function(options, callback) { 7 | var self = this; 8 | var $data = null; 9 | 10 | if(!("name" in options) && !("type" in options)){ 11 | $data = this._data;//the root tree 12 | callback({ data: $data }); 13 | return; 14 | } 15 | else if("type" in options && options.type == "folder") { 16 | if("additionalParameters" in options && "children" in options.additionalParameters) 17 | $data = options.additionalParameters.children; 18 | else $data = {}//no data 19 | } 20 | 21 | if($data != null)//this setTimeout is only for mimicking some random delay 22 | setTimeout(function(){callback({ data: $data });} , parseInt(Math.random() * 500) + 200); 23 | 24 | //we have used static data here 25 | //but you can retrieve your data dynamically from a server using ajax call 26 | //checkout examples/treeview.html and examples/treeview.js for more info 27 | }; 28 | 29 | var tree_data = { 30 | 'for-sale' : {name: 'For Sale', type: 'folder'} , 31 | 'vehicles' : {name: 'Vehicles', type: 'folder'} , 32 | 'rentals' : {name: 'Rentals', type: 'folder'} , 33 | 'real-estate' : {name: 'Real Estate', type: 'folder'} , 34 | 'pets' : {name: 'Pets', type: 'folder'} , 35 | 'tickets' : {name: 'Tickets', type: 'item'} , 36 | 'services' : {name: 'Services', type: 'item'} , 37 | 'personals' : {name: 'Personals', type: 'item'} 38 | } 39 | tree_data['for-sale']['additionalParameters'] = { 40 | 'children' : { 41 | 'appliances' : {name: 'Appliances', type: 'item'}, 42 | 'arts-crafts' : {name: 'Arts & Crafts', type: 'item'}, 43 | 'clothing' : {name: 'Clothing', type: 'item'}, 44 | 'computers' : {name: 'Computers', type: 'item'}, 45 | 'jewelry' : {name: 'Jewelry', type: 'item'}, 46 | 'office-business' : {name: 'Office & Business', type: 'item'}, 47 | 'sports-fitness' : {name: 'Sports & Fitness', type: 'item'} 48 | } 49 | } 50 | tree_data['vehicles']['additionalParameters'] = { 51 | 'children' : { 52 | 'cars' : {name: 'Cars', type: 'folder'}, 53 | 'motorcycles' : {name: 'Motorcycles', type: 'item'}, 54 | 'boats' : {name: 'Boats', type: 'item'} 55 | } 56 | } 57 | tree_data['vehicles']['additionalParameters']['children']['cars']['additionalParameters'] = { 58 | 'children' : { 59 | 'classics' : {name: 'Classics', type: 'item'}, 60 | 'convertibles' : {name: 'Convertibles', type: 'item'}, 61 | 'coupes' : {name: 'Coupes', type: 'item'}, 62 | 'hatchbacks' : {name: 'Hatchbacks', type: 'item'}, 63 | 'hybrids' : {name: 'Hybrids', type: 'item'}, 64 | 'suvs' : {name: 'SUVs', type: 'item'}, 65 | 'sedans' : {name: 'Sedans', type: 'item'}, 66 | 'trucks' : {name: 'Trucks', type: 'item'} 67 | } 68 | } 69 | 70 | tree_data['rentals']['additionalParameters'] = { 71 | 'children' : { 72 | 'apartments-rentals' : {name: 'Apartments', type: 'item'}, 73 | 'office-space-rentals' : {name: 'Office Space', type: 'item'}, 74 | 'vacation-rentals' : {name: 'Vacation Rentals', type: 'item'} 75 | } 76 | } 77 | tree_data['real-estate']['additionalParameters'] = { 78 | 'children' : { 79 | 'apartments' : {name: 'Apartments', type: 'item'}, 80 | 'villas' : {name: 'Villas', type: 'item'}, 81 | 'plots' : {name: 'Plots', type: 'item'} 82 | } 83 | } 84 | tree_data['pets']['additionalParameters'] = { 85 | 'children' : { 86 | 'cats' : {name: 'Cats', type: 'item'}, 87 | 'dogs' : {name: 'Dogs', type: 'item'}, 88 | 'horses' : {name: 'Horses', type: 'item'}, 89 | 'reptiles' : {name: 'Reptiles', type: 'item'} 90 | } 91 | } 92 | 93 | var treeDataSource = new DataSourceTree({data: tree_data}); 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | var tree_data_2 = { 106 | 'pictures' : {name: 'Pictures', type: 'folder', 'icon-class':'red'} , 107 | 'music' : {name: 'Music', type: 'folder', 'icon-class':'orange'} , 108 | 'video' : {name: 'Video', type: 'folder', 'icon-class':'blue'} , 109 | 'documents' : {name: 'Documents', type: 'folder', 'icon-class':'green'} , 110 | 'backup' : {name: 'Backup', type: 'folder'} , 111 | 'readme' : {name: ' ReadMe.txt', type: 'item'}, 112 | 'manual' : {name: ' Manual.html', type: 'item'} 113 | } 114 | tree_data_2['music']['additionalParameters'] = { 115 | 'children' : [ 116 | {name: ' song1.ogg', type: 'item'}, 117 | {name: ' song2.ogg', type: 'item'}, 118 | {name: ' song3.ogg', type: 'item'}, 119 | {name: ' song4.ogg', type: 'item'}, 120 | {name: ' song5.ogg', type: 'item'} 121 | ] 122 | } 123 | tree_data_2['video']['additionalParameters'] = { 124 | 'children' : [ 125 | {name: ' movie1.avi', type: 'item'}, 126 | {name: ' movie2.avi', type: 'item'}, 127 | {name: ' movie3.avi', type: 'item'}, 128 | {name: ' movie4.avi', type: 'item'}, 129 | {name: ' movie5.avi', type: 'item'} 130 | ] 131 | } 132 | tree_data_2['pictures']['additionalParameters'] = { 133 | 'children' : { 134 | 'wallpapers' : {name: 'Wallpapers', type: 'folder', 'icon-class':'pink'}, 135 | 'camera' : {name: 'Camera', type: 'folder', 'icon-class':'pink'} 136 | } 137 | } 138 | tree_data_2['pictures']['additionalParameters']['children']['wallpapers']['additionalParameters'] = { 139 | 'children' : [ 140 | {name: ' wallpaper1.jpg', type: 'item'}, 141 | {name: ' wallpaper2.jpg', type: 'item'}, 142 | {name: ' wallpaper3.jpg', type: 'item'}, 143 | {name: ' wallpaper4.jpg', type: 'item'} 144 | ] 145 | } 146 | tree_data_2['pictures']['additionalParameters']['children']['camera']['additionalParameters'] = { 147 | 'children' : [ 148 | {name: ' photo1.jpg', type: 'item'}, 149 | {name: ' photo2.jpg', type: 'item'}, 150 | {name: ' photo3.jpg', type: 'item'}, 151 | {name: ' photo4.jpg', type: 'item'}, 152 | {name: ' photo5.jpg', type: 'item'}, 153 | {name: ' photo6.jpg', type: 'item'} 154 | ] 155 | } 156 | 157 | 158 | tree_data_2['documents']['additionalParameters'] = { 159 | 'children' : [ 160 | {name: ' document1.pdf', type: 'item'}, 161 | {name: ' document2.doc', type: 'item'}, 162 | {name: ' document3.doc', type: 'item'}, 163 | {name: ' document4.pdf', type: 'item'}, 164 | {name: ' document5.doc', type: 'item'} 165 | ] 166 | } 167 | 168 | tree_data_2['backup']['additionalParameters'] = { 169 | 'children' : [ 170 | {name: ' backup1.zip', type: 'item'}, 171 | {name: ' backup2.zip', type: 'item'}, 172 | {name: ' backup3.zip', type: 'item'}, 173 | {name: ' backup4.zip', type: 'item'} 174 | ] 175 | } 176 | var treeDataSource2 = new DataSourceTree({data: tree_data_2}); -------------------------------------------------------------------------------- /ops/static/js/fuelux/fuelux.spinner.min.js: -------------------------------------------------------------------------------- 1 | (function(b,c){var a=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.spinner.defaults,d);this.$input=this.$element.find(".spinner-input");this.$element.on("keyup",this.$input,b.proxy(this.change,this));if(this.options.hold){this.$element.on("mousedown",".spinner-up",b.proxy(function(){this.startSpin(true)},this));this.$element.on("mouseup",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mouseout",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mousedown",".spinner-down",b.proxy(function(){this.startSpin(false)},this))}else{this.$element.on("click",".spinner-up",b.proxy(function(){this.step(true)},this));this.$element.on("click",".spinner-down",b.proxy(function(){this.step(false)},this))}this.switches={count:1,enabled:true};if(this.options.speed==="medium"){this.switches.speed=300}else{if(this.options.speed==="fast"){this.switches.speed=100}else{this.switches.speed=500}}this.lastValue=null;this.render();if(this.options.disabled){this.disable()}};a.prototype={constructor:a,render:function(){this.$input.val(this.options.value);this.$input.attr("maxlength",(this.options.max+"").split("").length)},change:function(){var d=this.$input.val();if(d/1){this.options.value=d/1}else{d=d.replace(/[^0-9]/g,"");this.$input.val(d);this.options.value=d/1}this.triggerChangedEvent()},stopSpin:function(){clearTimeout(this.switches.timeout);this.switches.count=1;this.triggerChangedEvent()},triggerChangedEvent:function(){var d=this.value();if(d===this.lastValue){return}this.lastValue=d;this.$element.trigger("changed",d);this.$element.trigger("change")},startSpin:function(d){if(!this.options.disabled){var e=this.switches.count;if(e===1){this.step(d);e=1}else{if(e<3){e=1.5}else{if(e<8){e=2.5}else{e=4}}}this.switches.timeout=setTimeout(b.proxy(function(){this.iterator(d)},this),this.switches.speed/e);this.switches.count++}},iterator:function(d){this.step(d);this.startSpin(d)},step:function(e){var g=this.options.value;var f=e?this.options.max:this.options.min;if((e?gf)){var d=g+(e?1:-1)*this.options.step;if(e?d>f:dLoading...
  • ",cacheItems:true};a.fn.tree.Constructor=b})(window.jQuery); -------------------------------------------------------------------------------- /ops/static/js/fuelux/fuelux.wizard.min.js: -------------------------------------------------------------------------------- 1 | (function(b,c){var a=function(f,e){var d;this.$element=b(f);this.options=b.extend({},b.fn.wizard.defaults,e);this.currentStep=1;this.numSteps=this.$element.find("li").length;this.$prevBtn=this.$element.find("button.btn-prev");this.$nextBtn=this.$element.find("button.btn-next");d=this.$nextBtn.children().detach();this.nextText=b.trim(this.$nextBtn.text());this.$nextBtn.append(d);this.$prevBtn.on("click",b.proxy(this.previous,this));this.$nextBtn.on("click",b.proxy(this.next,this));this.$element.on("click","li.complete",b.proxy(this.stepclicked,this));this.$stepContainer=this.$element.data("target")||"body";this.$stepContainer=b(this.$stepContainer)};a.prototype={constructor:a,setState:function(){var n=(this.currentStep>1);var o=(this.currentStep===1);var d=(this.currentStep===this.numSteps);this.$prevBtn.attr("disabled",(o===true||n===false));var h=this.$nextBtn.data();if(h&&h.last){this.lastText=h.last;if(typeof this.lastText!=="undefined"){var l=(d!==true)?this.nextText:this.lastText;var f=this.$nextBtn.children().detach();this.$nextBtn.text(l).append(f)}}var j=this.$element.find("li");j.removeClass("active").removeClass("complete");j.find("span.badge").removeClass("badge-info").removeClass("badge-success");var m="li:lt("+(this.currentStep-1)+")";var g=this.$element.find(m);g.addClass("complete");g.find("span.badge").addClass("badge-success");var e="li:eq("+(this.currentStep-1)+")";var k=this.$element.find(e);k.addClass("active");k.find("span.badge").addClass("badge-info");var i=k.data().target;this.$stepContainer.find(".step-pane").removeClass("active");b(i).addClass("active");this.$element.trigger("changed")},stepclicked:function(h){var d=b(h.currentTarget);var g=this.$element.find("li").index(d);var f=b.Event("stepclick");this.$element.trigger(f,{step:g+1});if(f.isDefaultPrevented()){return}this.currentStep=(g+1);this.setState()},previous:function(){var d=(this.currentStep>1);if(d){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"previous"});if(f.isDefaultPrevented()){return}this.currentStep-=1;this.setState()}},next:function(){var g=(this.currentStep+1<=this.numSteps);var d=(this.currentStep===this.numSteps);if(g){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"next"});if(f.isDefaultPrevented()){return}this.currentStep+=1;this.setState()}else{if(d){this.$element.trigger("finished")}}},selectedItem:function(d){return{step:this.currentStep}}};b.fn.wizard=function(e,g){var f;var d=this.each(function(){var j=b(this);var i=j.data("wizard");var h=typeof e==="object"&&e;if(!i){j.data("wizard",(i=new a(this,h)))}if(typeof e==="string"){f=i[e](g)}});return(f===c)?d:f};b.fn.wizard.defaults={};b.fn.wizard.Constructor=a;b(function(){b("body").on("mousedown.wizard.data-api",".wizard",function(){var d=b(this);if(d.data("wizard")){return}d.wizard(d.data())})})})(window.jQuery); -------------------------------------------------------------------------------- /ops/static/js/jqGrid/i18n/grid.locale-en.js: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | /** 3 | * jqGrid English Translation 4 | * Tony Tomov tony@trirand.com 5 | * http://trirand.com/blog/ 6 | * Dual licensed under the MIT and GPL licenses: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | * http://www.gnu.org/licenses/gpl.html 9 | **/ 10 | $.jgrid = $.jgrid || {}; 11 | $.extend($.jgrid,{ 12 | defaults : { 13 | recordtext: "View {0} - {1} of {2}", 14 | emptyrecords: "No records to view", 15 | loadtext: "Loading...", 16 | pgtext : "Page {0} of {1}" 17 | }, 18 | search : { 19 | caption: "Search...", 20 | Find: "Find", 21 | Reset: "Reset", 22 | odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'}], 23 | groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ] 24 | }, 25 | edit : { 26 | addCaption: "添加记录", 27 | editCaption: "编辑记录", 28 | bSubmit: "提交", 29 | bCancel: "取消", 30 | bClose: "关闭", 31 | saveData: "Data has been changed! Save changes?", 32 | bYes : "Yes", 33 | bNo : "No", 34 | bExit : "Cancel", 35 | msg: { 36 | required:"Field is required", 37 | number:"Please, enter valid number", 38 | minValue:"value must be greater than or equal to ", 39 | maxValue:"value must be less than or equal to", 40 | email: "is not a valid e-mail", 41 | integer: "Please, enter valid integer value", 42 | date: "Please, enter valid date value", 43 | url: "is not a valid URL. Prefix required ('http://' or 'https://')", 44 | nodefined : " is not defined!", 45 | novalue : " return value is required!", 46 | customarray : "Custom function should return array!", 47 | customfcheck : "Custom function should be present in case of custom checking!" 48 | 49 | } 50 | }, 51 | view : { 52 | caption: "查看", 53 | bClose: "关闭" 54 | }, 55 | del : { 56 | caption: "删除", 57 | msg: "确实删除选定的行?", 58 | bSubmit: "确认", 59 | bCancel: "取消" 60 | }, 61 | nav : { 62 | edittext: "", 63 | edittitle: "编辑", 64 | addtext:"", 65 | addtitle: "添加", 66 | deltext: "", 67 | deltitle: "删除", 68 | searchtext: "", 69 | searchtitle: "查找", 70 | refreshtext: "", 71 | refreshtitle: "刷新", 72 | alertcap: "Warning", 73 | alerttext: "请先选择行", 74 | viewtext: "", 75 | viewtitle: "查看" 76 | }, 77 | col : { 78 | caption: "Select columns", 79 | bSubmit: "Ok", 80 | bCancel: "Cancel" 81 | }, 82 | errors : { 83 | errcap : "Error", 84 | nourl : "No url is set", 85 | norecords: "No records to process", 86 | model : "Length of colNames <> colModel!" 87 | }, 88 | formatter : { 89 | integer : {thousandsSeparator: ",", defaultValue: '0'}, 90 | number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, 91 | currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, 92 | date : { 93 | dayNames: [ 94 | "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", 95 | "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 96 | ], 97 | monthNames: [ 98 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 99 | "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" 100 | ], 101 | AmPm : ["am","pm","AM","PM"], 102 | S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, 103 | srcformat: 'Y-m-d', 104 | newformat: 'n/j/Y', 105 | parseRe : /[Tt\\\/:_;.,\t\s-]/, 106 | masks : { 107 | // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid 108 | // and see http://docs.jquery.com/UI/Datepicker/formatDate 109 | // and https://github.com/jquery/globalize#dates for alternative formats used frequently 110 | // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many 111 | // information about date, time, numbers and currency formats used in different countries 112 | // one should just convert the information in PHP format 113 | ISO8601Long:"Y-m-d H:i:s", 114 | ISO8601Short:"Y-m-d", 115 | // short date: 116 | // n - Numeric representation of a month, without leading zeros 117 | // j - Day of the month without leading zeros 118 | // Y - A full numeric representation of a year, 4 digits 119 | // example: 3/1/2012 which means 1 March 2012 120 | ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" 121 | // long date: 122 | // l - A full textual representation of the day of the week 123 | // F - A full textual representation of a month 124 | // d - Day of the month, 2 digits with leading zeros 125 | // Y - A full numeric representation of a year, 4 digits 126 | LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" 127 | // long date with long time: 128 | // l - A full textual representation of the day of the week 129 | // F - A full textual representation of a month 130 | // d - Day of the month, 2 digits with leading zeros 131 | // Y - A full numeric representation of a year, 4 digits 132 | // g - 12-hour format of an hour without leading zeros 133 | // i - Minutes with leading zeros 134 | // s - Seconds, with leading zeros 135 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 136 | FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" 137 | // month day: 138 | // F - A full textual representation of a month 139 | // d - Day of the month, 2 digits with leading zeros 140 | MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" 141 | // short time (without seconds) 142 | // g - 12-hour format of an hour without leading zeros 143 | // i - Minutes with leading zeros 144 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 145 | ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" 146 | // long time (with seconds) 147 | // g - 12-hour format of an hour without leading zeros 148 | // i - Minutes with leading zeros 149 | // s - Seconds, with leading zeros 150 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 151 | LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" 152 | SortableDateTime: "Y-m-d\\TH:i:s", 153 | UniversalSortableDateTime: "Y-m-d H:i:sO", 154 | // month with year 155 | // Y - A full numeric representation of a year, 4 digits 156 | // F - A full textual representation of a month 157 | YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" 158 | }, 159 | reformatAfterEdit : false 160 | }, 161 | baseLinkUrl: '', 162 | showAction: '', 163 | target: '', 164 | checkbox : {disabled:true}, 165 | idName : 'id' 166 | } 167 | }); 168 | })(jQuery); 169 | -------------------------------------------------------------------------------- /ops/static/js/jqGrid/i18n/grid.locale-en.js.bak: -------------------------------------------------------------------------------- 1 | ;(function($){ 2 | /** 3 | * jqGrid English Translation 4 | * Tony Tomov tony@trirand.com 5 | * http://trirand.com/blog/ 6 | * Dual licensed under the MIT and GPL licenses: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | * http://www.gnu.org/licenses/gpl.html 9 | **/ 10 | $.jgrid = $.jgrid || {}; 11 | $.extend($.jgrid,{ 12 | defaults : { 13 | recordtext: "View {0} - {1} of {2}", 14 | emptyrecords: "No records to view", 15 | loadtext: "Loading...", 16 | pgtext : "Page {0} of {1}" 17 | }, 18 | search : { 19 | caption: "Search...", 20 | Find: "Find", 21 | Reset: "Reset", 22 | odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'}], 23 | groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ] 24 | }, 25 | edit : { 26 | addCaption: "Add Record", 27 | editCaption: "Edit Record", 28 | bSubmit: "Submit", 29 | bCancel: "Cancel", 30 | bClose: "Close", 31 | saveData: "Data has been changed! Save changes?", 32 | bYes : "Yes", 33 | bNo : "No", 34 | bExit : "Cancel", 35 | msg: { 36 | required:"Field is required", 37 | number:"Please, enter valid number", 38 | minValue:"value must be greater than or equal to ", 39 | maxValue:"value must be less than or equal to", 40 | email: "is not a valid e-mail", 41 | integer: "Please, enter valid integer value", 42 | date: "Please, enter valid date value", 43 | url: "is not a valid URL. Prefix required ('http://' or 'https://')", 44 | nodefined : " is not defined!", 45 | novalue : " return value is required!", 46 | customarray : "Custom function should return array!", 47 | customfcheck : "Custom function should be present in case of custom checking!" 48 | 49 | } 50 | }, 51 | view : { 52 | caption: "View Record", 53 | bClose: "Close" 54 | }, 55 | del : { 56 | caption: "Delete", 57 | msg: "Delete selected record(s)?", 58 | bSubmit: "Delete", 59 | bCancel: "Cancel" 60 | }, 61 | nav : { 62 | edittext: "", 63 | edittitle: "Edit selected row", 64 | addtext:"", 65 | addtitle: "Add new row", 66 | deltext: "", 67 | deltitle: "Delete selected row", 68 | searchtext: "", 69 | searchtitle: "Find records", 70 | refreshtext: "", 71 | refreshtitle: "Reload Grid", 72 | alertcap: "Warning", 73 | alerttext: "Please, select row", 74 | viewtext: "", 75 | viewtitle: "View selected row" 76 | }, 77 | col : { 78 | caption: "Select columns", 79 | bSubmit: "Ok", 80 | bCancel: "Cancel" 81 | }, 82 | errors : { 83 | errcap : "Error", 84 | nourl : "No url is set", 85 | norecords: "No records to process", 86 | model : "Length of colNames <> colModel!" 87 | }, 88 | formatter : { 89 | integer : {thousandsSeparator: ",", defaultValue: '0'}, 90 | number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'}, 91 | currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'}, 92 | date : { 93 | dayNames: [ 94 | "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", 95 | "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 96 | ], 97 | monthNames: [ 98 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 99 | "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" 100 | ], 101 | AmPm : ["am","pm","AM","PM"], 102 | S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';}, 103 | srcformat: 'Y-m-d', 104 | newformat: 'n/j/Y', 105 | parseRe : /[Tt\\\/:_;.,\t\s-]/, 106 | masks : { 107 | // see http://php.net/manual/en/function.date.php for PHP format used in jqGrid 108 | // and see http://docs.jquery.com/UI/Datepicker/formatDate 109 | // and https://github.com/jquery/globalize#dates for alternative formats used frequently 110 | // one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many 111 | // information about date, time, numbers and currency formats used in different countries 112 | // one should just convert the information in PHP format 113 | ISO8601Long:"Y-m-d H:i:s", 114 | ISO8601Short:"Y-m-d", 115 | // short date: 116 | // n - Numeric representation of a month, without leading zeros 117 | // j - Day of the month without leading zeros 118 | // Y - A full numeric representation of a year, 4 digits 119 | // example: 3/1/2012 which means 1 March 2012 120 | ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy" 121 | // long date: 122 | // l - A full textual representation of the day of the week 123 | // F - A full textual representation of a month 124 | // d - Day of the month, 2 digits with leading zeros 125 | // Y - A full numeric representation of a year, 4 digits 126 | LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy" 127 | // long date with long time: 128 | // l - A full textual representation of the day of the week 129 | // F - A full textual representation of a month 130 | // d - Day of the month, 2 digits with leading zeros 131 | // Y - A full numeric representation of a year, 4 digits 132 | // g - 12-hour format of an hour without leading zeros 133 | // i - Minutes with leading zeros 134 | // s - Seconds, with leading zeros 135 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 136 | FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt" 137 | // month day: 138 | // F - A full textual representation of a month 139 | // d - Day of the month, 2 digits with leading zeros 140 | MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd" 141 | // short time (without seconds) 142 | // g - 12-hour format of an hour without leading zeros 143 | // i - Minutes with leading zeros 144 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 145 | ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt" 146 | // long time (with seconds) 147 | // g - 12-hour format of an hour without leading zeros 148 | // i - Minutes with leading zeros 149 | // s - Seconds, with leading zeros 150 | // A - Uppercase Ante meridiem and Post meridiem (AM or PM) 151 | LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt" 152 | SortableDateTime: "Y-m-d\\TH:i:s", 153 | UniversalSortableDateTime: "Y-m-d H:i:sO", 154 | // month with year 155 | // Y - A full numeric representation of a year, 4 digits 156 | // F - A full textual representation of a month 157 | YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy" 158 | }, 159 | reformatAfterEdit : false 160 | }, 161 | baseLinkUrl: '', 162 | showAction: '', 163 | target: '', 164 | checkbox : {disabled:true}, 165 | idName : 'id' 166 | } 167 | }); 168 | })(jQuery); 169 | -------------------------------------------------------------------------------- /ops/static/js/jquery.autosize.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | Autosize v1.17.7 - 2013-09-03 3 | Automatically adjust textarea height based on user input. 4 | (c) 2013 Jack Moore - http://www.jacklmoore.com/autosize 5 | license: http://www.opensource.org/licenses/mit-license.php 6 | */ 7 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(window.jQuery||window.$)})(function(e){var t,o={className:"autosizejs",append:"",callback:!1,resizeDelay:10},i='