From a939088c1ee6b29f4cc88e366ecbed0fe70e628e Mon Sep 17 00:00:00 2001 From: sosguns2002 Date: Fri, 22 Dec 2017 21:49:02 +0200 Subject: [PATCH] New yellow theme plus full functionality --- .../madoap/src/madserverv2.py | 252 ++++-- .../madoap/src/static/OA DISCOVER_A.png | Bin 24028 -> 20977 bytes .../madoap/src/static/OA DISCOVER_B.png | Bin 39239 -> 36291 bytes .../madoap/src/static/animations.css | 4 +- .../madoap/src/static/configure-profile.js | 572 ++++++++++---- .../madoap/src/static/custom.css | 19 + .../madoap/src/static/database.db | Bin 16384 -> 65536 bytes .../madoap/src/static/dl119_files/custom.css | 737 ++++++++++++++++++ .../madoap/src/static/upload-codes.js | 201 ++++- .../madoap/src/templates/base_v2.html | 24 +- .../src/templates/configure_profile.html | 447 ++++++----- .../src/templates/create_upload_profile.html | 16 +- .../madoap/src/templates/save_profile.html | 39 +- .../madoap/src/templates/upload_codes.html | 84 +- 14 files changed, 1914 insertions(+), 481 deletions(-) diff --git a/interactive-mining-madoap/madoap/src/madserverv2.py b/interactive-mining-madoap/madoap/src/madserverv2.py index 042864b..f6603ea 100755 --- a/interactive-mining-madoap/madoap/src/madserverv2.py +++ b/interactive-mining-madoap/madoap/src/madserverv2.py @@ -113,6 +113,41 @@ def numberOfDocsUploaded(user_id): return num_lines return 0 +def loadProfile(profileLocation, user_id): + # extract data from profile file + import sys + sys.path.append(msettings.MADIS_PATH) + import madis + # get the profile database cursor + cursor=madis.functions.Connection(profileLocation).cursor() + + # data to be sent + data = {} + # Write to csv file the grants ids + if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='grants'")]): + cursor.execute("output '/tmp/p{0}.tsv' select c1,c2 from grants".format(user_id)) + # Get the number of grants uploaded + file_name = "/tmp/p%s.tsv" % (user_id) + if os.path.isfile(file_name): + numberOfGrants = sum(1 for line in open(file_name)) + data['grants'] = numberOfGrants + # write to json the poswords + if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='poswords'")]): + results = [r for r in cursor.execute("select c1, c2 from poswords")] + data['poswords'] = {value:key for value, key in results} + # write to json the negwords + if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='negwords'")]): + results = [r for r in cursor.execute("select c1, c2 from negwords")] + data['negwords'] = {value:key for value, key in results} + # write to json the filters + if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='filters'")]): + results = [r for r in cursor.execute("select c1, c2 from filters")] + for value, key in results: + data[value] = key + # data['filters'] = {value:key for value, key in results} + cursor.close() + return data + def deleteAllUserFiles(user_id): if user_id: file_name = "/tmp/p%s.tsv" % (user_id) @@ -122,6 +157,22 @@ def deleteAllUserFiles(user_id): if os.path.isfile(file_name): os.remove(file_name) +def loadExampleDocs(user_id): + sample_file = open("static/exampleDocs.txt", 'r') + # write data to physical file + cname = "/tmp/docs{0}.json".format(user_id) + fh = open(cname, 'w') + while 1: + copy_buffer = sample_file.read(1048576) + if not copy_buffer: + break + fh.write(copy_buffer) + fh.close() + lines_num = sum(1 for line in open(cname)) + +def loadExampleProfile(user_id): + return loadProfile("static/exampleProfile.oamp", user_id) + class BaseHandler(ozhandler.DjangoErrorMixin, ozhandler.BasicAuthMixin, tornado.web.RequestHandler): def __init__(self, *args): @@ -322,6 +373,8 @@ class createUploadProfileHandler(BaseHandler): try: user_id = self.get_secure_cookie('madgikmining') if user_id is None: + self.set_status(400) + self.write("Missing cookie containing user's id...") return if 'upload' in self.request.files: # get file info and body from post data @@ -337,39 +390,23 @@ class createUploadProfileHandler(BaseHandler): fh = open(cname, 'w') fh.write(fileinfo['body']) fh.close() - # extract data from profile file - import sys - sys.path.append(msettings.MADIS_PATH) - import madis - # get the profile database cursor - cursor=madis.functions.Connection(cname).cursor() - - # data to be sent - data = {} - # Write to csv file the grants ids - if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='grants'")]): - cursor.execute("output '/tmp/p{0}.csv' select * from grants".format(user_id)) - numberOfGrants = numberOfGrantsUploaded(user_id, "puppet_value") - self.set_secure_cookie('madgikmining_grantsuploaded', str(numberOfGrants)) - data['grants'] = numberOfGrants - # write to json the poswords - if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='poswords'")]): - results = [r for r in cursor.execute("select c1, c2 from poswords")] - data['poswords'] = {value:key for value, key in results} - # write to json the negwords - if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='negwords'")]): - results = [r for r in cursor.execute("select c1, c2 from negwords")] - data['negwords'] = {value:key for value, key in results} - # write to json the filters - if len([r for r in cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='filters'")]): - results = [r for r in cursor.execute("select c1, c2 from filters")] - data['filters'] = {value:key for value, key in results} - cursor.close() + data = loadProfile(cname, user_id) + self.set_secure_cookie('madgikmining_grantsuploaded', str(data['grants'])) + self.write(json.dumps(data)) + self.finish() + elif 'example' in self.request.arguments: + # reset everything + deleteAllUserFiles(user_id) + # load example data + loadExampleDocs(user_id) + data = loadExampleProfile(user_id) + self.set_secure_cookie('madgikmining_grantsuploaded', str(data['grants'])) self.write(json.dumps(data)) self.finish() except Exception as ints: - self.write(json.dumps({'respond': "Something went very wrong!"})) + self.set_status(400) + self.write("Something is wrong with this profile file...") print ints return @@ -389,12 +426,15 @@ class uploadCodesHandler(BaseHandler): # reset everything deleteAllUserFiles(user_id) # check if he already uploaded his grants ids and inform him via a message - self.render('upload_codes.html', settings=msettings) + numOfGrants = numberOfGrantsUploaded(user_id, self.get_secure_cookie('madgikmining_grantsuploaded')) + self.render('upload_codes.html', settings=msettings, numOfGrants=numOfGrants) def post(self): try: # get user id from cookie. Must have user_id = self.get_secure_cookie('madgikmining') if user_id is None: + self.set_status(400) + self.write("Missing cookie containing user's id...") return # service to upload a tsv file with the codes. Returns the codes if 'upload' in self.request.files: @@ -404,7 +444,8 @@ class uploadCodesHandler(BaseHandler): extn = os.path.splitext(fname)[1] # must be .pdf or .json if extn != ".tsv" and extn != ".txt": - self.write(json.dumps({'respond': "File must be .tsv or .txt"})) + self.set_status(400) + self.write("File must be .tsv or .txt...") return codes = {} lines = fileinfo['body'].splitlines() @@ -440,7 +481,9 @@ class uploadCodesHandler(BaseHandler): # data to be sent data = {} if len(concepts) == 0: - data['error'] = "You have to provide at least one concept to continue" + self.set_status(400) + self.write("You have to provide at least one concept to continue!") + return else: data['respond'] = "{0} Codes loaded successfully!".format(len(concepts)) self.set_secure_cookie('madgikmining_grantsuploaded', str(len(concepts))) @@ -470,9 +513,8 @@ class uploadCodesHandler(BaseHandler): self.finish() except Exception as ints: - data = {} - data['error'] = "File Failed to Upload!" - self.write(json.dumps(data)) + self.set_status(400) + self.write("A server error occurred, please contact administrator!") self.finish() print ints return @@ -491,7 +533,7 @@ class configureProfileHandler(BaseHandler): return # check if he uploaded his codes if numberOfGrantsUploaded(user_id, self.get_secure_cookie('madgikmining_grantsuploaded')): - self.render('configure_profile.html', settings=msettings) + self.render('configure_profile2.html', settings=msettings) else: self.redirect('/upload-codes') def post(self): @@ -510,7 +552,9 @@ class configureProfileHandler(BaseHandler): data = {} # must be .pdf, .txt or .json if extn != ".pdf" and extn != ".txt" and extn != ".json": - data['error'] = "File must be .pdf, .json or .txt" + self.set_status(400) + self.write("File must be .pdf, .json or .txt") + return return # write data to physical file cname = "/tmp/docs{0}{1}".format(user_id, extn) @@ -523,14 +567,16 @@ class configureProfileHandler(BaseHandler): p = sub.Popen(['pdftotext', '-enc', 'UTF-8', cname],stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() if errors: - data['error'] = "Cannot convert .pdf to .txt" + self.set_status(400) + self.write("An error occurred when trying to convert .pdf to .txt...") return os.remove(cname) cname = "/tmp/docs{0}.txt".format(user_id) with open(cname, 'r') as fin: docData=fin.read().replace('\n', ' ') if len(docData)==0: - data['error'] = "Cannot convert .pdf to .txt" + self.set_status(400) + self.write("An error occurred when trying to convert .pdf to text...") return with open("/tmp/docs{0}.json".format(user_id), "wb") as fout: json.dump({"text":docData,"id":os.path.splitext(fname)[0]}, fout) @@ -543,13 +589,16 @@ class configureProfileHandler(BaseHandler): jsonlist.append(json.loads(line)) os.rename(cname, "/tmp/docs{0}.json".format(user_id)) except ValueError, e: - data['error'] = "File is not in a valid json format" + self.set_status(400) + self.write("File is not in a valid json format...") os.remove(cname) print e return file_name = "/tmp/docs%s.json" % (user_id) if os.path.isfile(file_name): - data['data'] = sum(1 for line in open(file_name)) + lines = sum(1 for line in open(file_name)) + data['respond'] = "{0} Documents loaded successfully!".format(lines) + data['data'] = lines self.write(json.dumps(data)) self.finish() # post case where the user selects form preset documents samples @@ -578,8 +627,11 @@ class configureProfileHandler(BaseHandler): # data to be sent data = {} if lines_num == 0: - data['error'] = "You have to provide at least one concept to continue" + self.set_status(400) + self.write("File must contain atleast one document...") + return else: + data['respond'] = "{0} Documents loaded successfully!".format(lines_num) data['data'] = lines_num self.write(json.dumps(data)) self.finish() @@ -598,8 +650,63 @@ class configureProfileHandler(BaseHandler): self.finish() # post case for the actual mining proccess else: + # get the database cursor + cursor=msettings.Connection.cursor() + # data to be sent data = {} + + # set the textwindow size + extracontextprev = 10 + extracontextnext = 10 + contextprev = 10 + contextnext = 5 + # Automatically find middle size from grant codes white spaces + querygrantsize = "select max(p1) from (select regexpcountwords('\s',stripchars(p1)) as p1 from (setschema 'p1,p2' file '/tmp/p{0}.tsv' dialect:tsv))".format(user_id) + contextmiddle = [r for r in cursor.execute(querygrantsize)][0][0]+1 + if 'contextprev' in self.request.arguments and self.request.arguments['contextprev'][0] != '': + contextprev = int(self.request.arguments['contextprev'][0]) + if contextprev < 0 or contextprev > 20: + self.set_status(400) + self.write("Context size must be in its limits...") + return + if 'contextnext' in self.request.arguments and self.request.arguments['contextnext'][0] != '': + contextnext = int(self.request.arguments['contextnext'][0]) + if contextnext < 0 or contextnext > 20: + self.set_status(400) + self.write("Context size must be in its limits...") + return + j2sextraprev = "j2s(prev1" + for cnt in xrange(2,extracontextprev+1): + j2sextraprev += ",prev"+str(cnt) + j2sextraprev += ")" + j2sprev = "" + j2scontext = "(" + if contextprev: + j2scontext = "j2s(prev"+str(extracontextprev+1) + j2sprev = "j2s(prev"+str(extracontextprev+1) + for cnt in xrange(extracontextprev+2,extracontextprev+contextprev+1): + j2sprev += ",prev"+str(cnt) + j2scontext += ",prev"+str(cnt) + j2sprev += ")" + j2scontext += "," + else: + j2scontext = "j2s(" + j2snext = "j2s(next1" + j2scontext += "middle" + if contextnext: + j2scontext += ",next1" + for cnt in xrange(2,contextnext+1): + j2snext += ",next"+str(cnt) + j2scontext += ",next"+str(cnt) + j2snext += ")" + j2scontext += ")" + j2sextranext = "j2s(next"+str(contextnext+1) + for cnt in xrange(contextnext+2,extracontextnext+contextnext+1): + j2sextranext += ",next"+str(cnt) + j2sextranext += ")" + print j2sextraprev, j2sprev, j2snext, j2sextranext, j2scontext + # create positive and negative words weighted regex text pos_set = neg_set = conf = whr_conf = '' if 'poswords' in self.request.arguments and self.request.arguments['poswords'][0] != '{}': @@ -607,7 +714,10 @@ class configureProfileHandler(BaseHandler): # construct math string for positive words matching calculation with weights pos_words = json.loads(self.request.arguments['poswords'][0]) for key, value in pos_words.iteritems(): - pos_set += r'regexpcountuniquematches("(?:\b)%s(?:\b)",j2s(prev,middle,next))*%s + ' % (key,value) + # MONO GIA TO EGI + pos_set += r'regexpcountuniquematches("%s",%s)*%s + ' % (key,j2scontext,value) + # ORIGINAL + # pos_set += r'regexpcountuniquematches("(?:\b)%s(?:\b)",j2s(prev,middle,next))*%s + ' % (key,value) data['poswords'].append(key) pos_set += "0" if 'negwords' in self.request.arguments and self.request.arguments['negwords'][0] != '{}': @@ -615,7 +725,10 @@ class configureProfileHandler(BaseHandler): # construct math string for negative words matching calculation with weights neg_words = json.loads(self.request.arguments['negwords'][0]) for key, value in neg_words.iteritems(): - neg_set += r'regexpcountuniquematches("(?:\b)%s(?:\b)",j2s(prev,middle,next))*%s - ' % (key,value) + # MONO GIA TO EGI + neg_set += r'regexpcountuniquematches("%s",%s)*%s + ' % (key,j2scontext,value) + # ORIGINAL + # neg_set += r'regexpcountuniquematches("(?:\b)%s(?:\b)",j2s(prev,middle,next))*%s - ' % (key,value) data['negwords'].append(key) neg_set += "0" if pos_set != '' and neg_set != '': @@ -628,25 +741,23 @@ class configureProfileHandler(BaseHandler): conf += ' as conf' whr_conf = 'and conf>=0' - # get the database cursor - cursor=msettings.Connection.cursor() - if numberOfDocsUploaded(user_id) != 0: - doc_filters = "regexpr('[\n|\r]',d2,' ')" - ackn_filters = "regexpr(\"\\'\", p2,'')" + doc_filters = "comprspaces(regexpr('[\n|\r]',d2,' '))" + ackn_filters = "comprspaces(regexpr(\"\\'\", p2,''))" if 'punctuation' in self.request.arguments and self.request.arguments['punctuation'][0] == "1": doc_filters = 'keywords('+doc_filters+')' ackn_filters = 'keywords('+ackn_filters+')' - if 'lettercase' in self.request.arguments and self.request.arguments['lettercase'][0] != '' and self.request.arguments['lettercase'][0] != 'None': - if self.request.arguments['lettercase'][0] == 'Lowercase': + if 'lettercase' in self.request.arguments and self.request.arguments['lettercase'][0] != '' and self.request.arguments['lettercase'][0] != 'none': + if self.request.arguments['lettercase'][0] == 'lowercase': doc_filters = 'lower('+doc_filters+')' ackn_filters = 'lower('+ackn_filters+')' - elif self.request.arguments['lettercase'][0] == 'Uppercase': + elif self.request.arguments['lettercase'][0] == 'uppercase': doc_filters = 'upper('+doc_filters+')' ackn_filters = 'upper('+ackn_filters+')' if 'stopwords' in self.request.arguments and self.request.arguments['stopwords'][0] == "1": doc_filters = 'filterstopwords('+doc_filters+')' ackn_filters = 'filterstopwords('+ackn_filters+')' + print "DOCCC", doc_filters list(cursor.execute("drop table if exists grantstemp"+user_id, parse=False)) query_pre_grants = "create temp table grantstemp{0} as select stripchars(p1) as gt1, case when p2 is null then null else {1} end as gt2 from (setschema 'p1,p2' file '/tmp/p{0}.tsv' dialect:tsv)".format(user_id, ackn_filters) cursor.execute(query_pre_grants) @@ -654,27 +765,38 @@ class configureProfileHandler(BaseHandler): query1 = "create temp table docs{0} as select d1, {1} as d2 from (setschema 'd1,d2' select jsonpath(c1, '$.id', '$.text') from (file '/tmp/docs{0}.json'))".format(user_id, doc_filters) cursor.execute(query1) else: - data['error'] = "You have to provide at least one concept to continue" - self.write(json.dumps(data)) - self.finish() + self.set_status(400) + self.write("You have to provide atleast 1 document...") return list(cursor.execute("drop table if exists grants"+user_id, parse=False)) # string concatenation workaround because of the special characters conflicts if 'wordssplitnum' in self.request.arguments and self.request.arguments['wordssplitnum'][0] != '': words_split = int(self.request.arguments['wordssplitnum'][0]) + # MONO GIA TO EGI if 0 < words_split and words_split <= 10: - acknowledgment_split = r'textwindow2s(regexpr("([\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|])", gt2, "\\\1"),0,'+str(words_split)+r',0)' + acknowledgment_split = r'textwindow2s(gt2,0,'+str(words_split)+r',0)' else: - acknowledgment_split = r'"prev" as prev, regexpr("([\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|])", gt2, "\\\1") as middle, "next" as next' + acknowledgment_split = r'"dummy" as prev, gt2 as middle, "dummy" as next' + # ORIGINAL + # if 0 < words_split and words_split <= 10: + # acknowledgment_split = r'textwindow2s(regexpr("([\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|])", gt2, "\\\1"),0,'+str(words_split)+r',0)' + # else: + # acknowledgment_split = r'"dummy" as prev, regexpr("([\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|])", gt2, "\\\1") as middle, "dummy" as next' + # query0 = r"create temp table grants"+user_id+r' as select gt1 as g1, jmergeregexp(jgroup("(?<=[\s\b])"||middle||"(?=[\s\b])")) as g2 from '+r"(setschema 'gt1,prev,middle,next' select gt1, "+acknowledgment_split+r' from grantstemp'+user_id+r' where (gt1 or gt1!="") and gt2 not null) group by gt1 union all select distinct gt1 as g1, "(?!.*)" as g2 from grantstemp'+user_id+r" where (gt1 or gt1!='') and gt2 is null" - query0 = r"create temp table grants"+user_id+r' as select gt1 as g1, jmergeregexp(jgroup(middle)) as g2 from '+r"(setschema 'gt1,prev,middle,next' select gt1, "+acknowledgment_split+r' from grantstemp'+user_id+r' where (gt1 or gt1!="") and gt2 not null) group by gt1 union all select distinct gt1 as g1, "(?!.*)" as g2 from grantstemp'+user_id+r" where (gt1 or gt1!='') and gt2 is null" + query0 = r"create temp table grants"+user_id+r' as select gt1 as g1, jmergeregexp(jgroup(middle)) as g2 from '+r"(setschema 'gt1,prev,middle,next' select gt1, "+acknowledgment_split+r' from grantstemp'+user_id+r' where (gt1 or gt1!="") and gt2 != "") group by gt1 union all select distinct gt1 as g1, "(?!.*)" as g2 from grantstemp'+user_id+r" where (gt1 or gt1!='') and gt2 = ''" cursor.execute(query0) query0get = "select * from grants{0}".format(user_id) results0get = [r for r in cursor.execute(query0get)] print results0get - query2 = "select d1, g1, context, acknmatch, max(confidence) as confidence from (select d1, g1, regexpcountuniquematches(g2, j2s(prev,middle,next)) as confidence, j2s(prev,middle,next) as context, regexprfindall(g2, j2s(prev,middle,next)) as acknmatch {0} from (select d1, textwindow2s(d2,20,1,20) from (select * from docs{1})), (select g1, g2 from grants{1}) T where middle = T.g1 {2}) group by d1".format(conf, user_id, whr_conf) + # FOR EGI ONLY + query2 = r'select distinct d1, g1, extraprev, prev, middle, next, extranext, acknmatch, max(confidence) as confidence from (select d1, g1, regexpcountuniquematches(g2, '+j2scontext+r') as confidence, stripchars('+j2sextraprev+r') as extraprev, stripchars('+j2sprev+r') as prev, middle, stripchars('+j2snext+r') as next, stripchars('+j2sextranext+r') as extranext, '+j2scontext+r' as context, regexprfindall(g2, '+j2scontext+r') as acknmatch '+conf+r' from (select d1, textwindow(d2,'+str(extracontextprev+contextprev)+r','+str(extracontextnext+contextnext)+r','+str(contextmiddle)+r') from docs'+user_id+r'), (select g1, g2 from grants'+user_id+r') T where regexprmatches("(\b|\d|\W)"||T.g1||"(\b|\d|\W)",middle) '+whr_conf+r') group by d1' + # ORIGINAL + # query2 = "select d1, g1, context, acknmatch, max(confidence) as confidence from (select d1, g1, regexpcountuniquematches(g2, j2s(prev,middle,next)) as confidence, j2s(prev,middle,next) as context, regexprfindall(g2, j2s(prev,middle,next)) as acknmatch {0} from (select d1, textwindow2s(d2,20,{3},20) from docs{1}), (select g1, g2 from grants{1}) T where regexprmatches(T.g1,middle) {2}) group by d1".format(conf, user_id, whr_conf, contextmiddle) + + # OLD ONE # query2 = "select c1, c3 {0} from (select c1, textwindow2s(c2,10,1,5) from (select * from docs{1})), (select c3 from grants{1}) T where middle = T.c3 {2}".format(conf, user_id, whr_conf) results = [r for r in cursor.execute(query2)] print results @@ -682,16 +804,16 @@ class configureProfileHandler(BaseHandler): for r in results: if r[0] not in doctitles: doctitles[r[0]] = [] - doctitles[r[0]].append({"match": r[1], "context": r[2], "acknmatch": json.loads(r[3]), "confidence": r[4]}) + doctitles[r[0]].append({"match": r[1], "extraprev": r[2], "prev": r[3], "middle": r[4], "next":r[5], "extranext":r[6], "acknmatch": json.loads(r[7]), "confidence": r[8]}) data['matches'] = doctitles + data['respond'] = "Matching results updated!" self.write(json.dumps(data)) self.flush() self.finish() except Exception as ints: - data = {} - data['error'] = "Something went very very wrong!" - self.write(json.dumps(data)) + self.set_status(400) + self.write("A server error occurred, please contact administrator!") self.finish() print ints @@ -759,7 +881,7 @@ class saveProfileHandler(BaseHandler): cursor.execute("create table filters(c1,c2)", parse=False) # Create grants table cursor.execute("drop table if exists grants", parse=False) - cursor.execute("create table grants(c1)", parse=False) + cursor.execute("create table grants(c1,c2)", parse=False) if 'poswords' in self.request.arguments and self.request.arguments['poswords'][0] != '{}': # construct math string for positive words matching calculation with weights pos_words = json.loads(self.request.arguments['poswords'][0]) @@ -785,7 +907,7 @@ class saveProfileHandler(BaseHandler): ) ) if numberOfGrantsUploaded(user_id, self.get_secure_cookie('madgikmining_grantsuploaded')) != 0: - cursor.execute("insert into grants select stripchars(c1) as c1 from (file '/tmp/p{0}.csv')".format(user_id)) + cursor.execute("insert into grants select stripchars(c1) as c1, stripchars(c2) as c2 from (file '/tmp/p{0}.tsv')".format(user_id)) cursor.close() data = {} diff --git a/interactive-mining-madoap/madoap/src/static/OA DISCOVER_A.png b/interactive-mining-madoap/madoap/src/static/OA DISCOVER_A.png index e8c097c5df496bee6074c83ba25e1dda4f68b165..e15058e4e858ea588e3911e37eacdf01b6711a23 100644 GIT binary patch literal 20977 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 PK!Eaa^L4%E5|;4~?C~|T literal 24028 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 P0#&ZGm% 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 CXvnPq diff --git a/interactive-mining-madoap/madoap/src/static/OA DISCOVER_B.png b/interactive-mining-madoap/madoap/src/static/OA DISCOVER_B.png index 26d484664af1b90cfcdf92e99d30553b0da25465..75d20704863687cd0830e196bb866568d66fd7ac 100644 GIT binary patch literal 36291 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 diff --git a/interactive-mining-madoap/madoap/src/static/animations.css b/interactive-mining-madoap/madoap/src/static/animations.css index 904d84c..cd74718 100644 --- a/interactive-mining-madoap/madoap/src/static/animations.css +++ b/interactive-mining-madoap/madoap/src/static/animations.css @@ -1,5 +1,5 @@ /*ANIMATIONS*/ -tr.new-item { +tr.new-item, li.new-item { opacity:0; -webkit-animation:fadeIn .1s linear forwards; -o-animation:fadeIn .1s linear forwards; @@ -17,7 +17,7 @@ tr.new-item { } } -tr.removed-item { +tr.removed-item, li.removed-item { -webkit-animation: removed-item-animation .3s cubic-bezier(.55,-0.04,.91,.94) forwards; -o-animation: removed-item-animation .3s cubic-bezier(.55,-0.04,.91,.94) forwards; animation: removed-item-animation .3s cubic-bezier(.55,-0.04,.91,.94) forwards diff --git a/interactive-mining-madoap/madoap/src/static/configure-profile.js b/interactive-mining-madoap/madoap/src/static/configure-profile.js index b284800..1b003f0 100644 --- a/interactive-mining-madoap/madoap/src/static/configure-profile.js +++ b/interactive-mining-madoap/madoap/src/static/configure-profile.js @@ -39,8 +39,10 @@ var handleMatchLevelChoice = function() { $('#1-level').on('click', function( e ) { + $(".cm-config-option.active").removeClass("active"); + $(this).addClass("active"); if (advanced_options_open) { - UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); + toggleAdvancedTools(); advanced_options_open = 0; } if (match_level_choice != 0) { @@ -57,8 +59,10 @@ match_level_choice = 0; }); $('#2-level').on('click', function( e ) { + $(".cm-config-option.active").removeClass("active"); + $(this).addClass("active"); if (advanced_options_open) { - UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); + toggleAdvancedTools(); advanced_options_open = 0; } if (match_level_choice != 1) { @@ -71,8 +75,10 @@ match_level_choice = 1; }); $('#3-level').on('click', function( e ) { + $(".cm-config-option.active").removeClass("active"); + $(this).addClass("active"); if (advanced_options_open) { - UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); + toggleAdvancedTools(); advanced_options_open = 0; } if (match_level_choice != 2) { @@ -84,9 +90,52 @@ } match_level_choice = 2; }); - $('#c-level').on('click', function( e ) { + // $('#c-level').on('click', function( e ) { + // $(".cm-config-option.active").removeClass("active"); + // $(this).addClass("active"); + // if (advanced_options_open == 0) { + // toggleAdvancedTools(); + // advanced_options_open = 1; + // } + // if (match_level_choice != 3) { + // console.log('#c-level'); + // // store change to localstorage + // localStorage.setItem('matchlevel', "#c-level"); + // } + // }); + + $("#advaned-tools-label").change(function() { + if(this.checked) { + advanced_options_open = 1; + $(".cm-config-option.active").removeClass("active"); + // $('#c-level').click(); + $('#advaned-tools').show(); + localStorage.setItem('matchlevel', "#c-level"); + } else { + advanced_options_open = 0; + if (match_level_choice == 0 || match_level_choice == -1 || match_level_choice == 3) { + match_level_choice = 3; + $('#1-level').click(); + } else if (match_level_choice == 1) { + match_level_choice = 3; + $('#2-level').click(); + } else if (match_level_choice == 2) { + match_level_choice = 3; + $('#3-level').click(); + } + $('#advaned-tools').hide(); + } + }); + + // UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); + // UIkit.switcher($('#uk-switcher')).show(3); + // UIkit.switcher($('.uk-switcher')).show(3); + } + + var handlePreccisionMode = function(choice) { + if (choice === "#c-level") { if (advanced_options_open == 0) { - UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); + toggleAdvancedTools(); advanced_options_open = 1; } if (match_level_choice != 3) { @@ -94,43 +143,25 @@ // store change to localstorage localStorage.setItem('matchlevel', "#c-level"); } - }); - // $('#advanced-opts-toggle').on('show', function () { - // console.log('#GG-level'); - // UIkit.switcher($('#uk-switcher')).show(3); - // UIkit.switcher($('.uk-switcher')).show(3); - // advanced_options_open = 1; - // }); - // $('#advanced-opts-toggle').on('hide', function () { - // console.log('#BB-level'); - // UIkit.switcher($('#uk-switcher')).show(match_level_choice); - // UIkit.switcher($('.uk-switcher')).show(match_level_choice); - // advanced_options_open = 0; - // }); - - $('#advanced-opts-toggle').on('show', function () { - console.log('#GG-level'); - advanced_options_open = 1; - $('#c-level').click(); - }); - $('#advanced-opts-toggle').on('hide', function () { - console.log('#BB-level'); - advanced_options_open = 0; - if (match_level_choice == 0) { - match_level_choice = 3; - $('#1-level').click(); - } else if (match_level_choice == 1) { - match_level_choice = 3; - $('#2-level').click(); - } else if (match_level_choice == 2) { - match_level_choice = 3; - $('#3-level').click(); - } - }); + } else { + $(choice).click(); + } + } - // UIkit.accordion($('#advanced-opts-toggle')).toggle(0, true); - // UIkit.switcher($('#uk-switcher')).show(3); - // UIkit.switcher($('.uk-switcher')).show(3); + var toggleAdvancedTools = function() { + if($("#advaned-tools-label").prop('checked')) { + $("#advaned-tools-label").prop('checked', false); + $("#advaned-tools-label").attr('checked', false); + $('#advaned-tools-label')[0].checked = false; + $('#advaned-tools-label').removeAttr('checked'); + $('#advaned-tools').hide(); + } else { + localStorage.setItem('matchlevel', "#c-level"); + $("#advaned-tools-label").prop('checked', true); + $("#advaned-tools-label").attr('checked', true); + $('#advaned-tools-label')[0].checked = true; + $('#advaned-tools').show(); + } } /////////// LIST FUNCTIONS @@ -160,7 +191,7 @@ } //generates a unique id - var generateId = function(is_pos){ + var generateId = function(is_pos) { if (is_pos) { return "positive-" + +new Date() + Math.random().toFixed(5).substring(2); } else { @@ -168,24 +199,49 @@ } } + var wordAlreadyExists = function(is_pos, word) { + var found = false; + for (var key in localStorage) { + if (key === null) + continue; + var value = localStorage.getItem(key); + if(is_pos && key.indexOf('positive') === 0){ + data = JSON.parse(value); + if (data.phrase === word) { + found = true; + alert("OOOOOOOOOP"); + break; + } + } else if (key.indexOf('negative') === 0) { + data = JSON.parse(value); + if (data.phrase === word) { + found = true; + alert("OOOOOOOOOP"); + break; + } + } + } + return found; + } + var wordsDataToArray = function(is_pos) { // TODO var data = {}; if (is_pos === 1) { - $("#word-pos tbody tr").each(function(i, v){ + $("#word-pos li").each(function(i, v){ // data[i] = Array(); // $(this).children('td').each(function(ii, vv){ // data[i][ii] = $(this).text(); // }); - data[$(v).find("td.phrase").text()] = $(v).find("td.weight").text(); + data[$(v).find("div.phrase").text()] = $(v).find("div.weight").text(); }) } else { - $("#word-neg tbody tr").each(function(i, v){ + $("#word-neg li").each(function(i, v){ // data[i] = Array(); // $(this).children('td').each(function(ii, vv){ // data[i][ii] = $(this).text(); // }); - data[$(v).find("td.phrase").text()] = $(v).find("td.weight").text(); + data[$(v).find("div.phrase").text()] = $(v).find("div.weight").text(); }) } @@ -231,8 +287,8 @@ }); // Handle clicks outside editboxes $(document).click(function (event) { - if($(event.target).attr('class')!="thVal") { - saveEditBox(currentEle); + if($(event.target).hasClass('thVal')===false) { + saveEditBox(clickedElement); $(document).off('click'); clickedElement = null; } @@ -242,7 +298,7 @@ // a fucntion to catch double click on positive and negative phrases edit boxes var addDoubleClick = function(element){ $(element).click(function (event) { - if($(event.target).attr('class')!="thVal") { + if($(event.target).hasClass('thVal')===false) { event.stopPropagation(); // save previous clicked box if (clickedElement) @@ -261,7 +317,7 @@ $(this).remove(); }); // remove from localstorage - localStorage.remove('#' + id); + localStorage.removeItem(id); if (is_pos === 1) { count_pos--; } else { @@ -273,23 +329,25 @@ var count_pos = 0, count_neg = 0; var addDataToTable = function(id, content_word, content_weight, is_pos) { - var row = '' + content_word + '' + content_weight +'' - table = $('#data-table tbody'); + // with number column + // var row = '
  • '+count_pos+'
    ' + content_word + '
    ' + content_weight +'
  • ' + var row = '
  • ' + content_word + '
    ' + content_weight +'
  • ' + table = $('#data-table'); // if content is correct and not empty append to table if(!$('#'+ id).length){ row = $(row).addClass('new-item'); if (is_pos === 1) { - $('#word-pos tbody').append(row); + $('#word-pos').append(row); } else { - $('#word-neg tbody').append(row); + $('#word-neg').append(row); } // add all the item's extra functionality var createdItem = $('#'+ id); // delete button - createdItem.append($('').append($('
    ', { + createdItem.append($('
    ' , {"class": "uk-width-1-4@m uk-text-center erase"}).append($('', { "class" :"uk-icon-link", "uk-icon" : "icon: trash", "contenteditable" : "false", @@ -300,8 +358,8 @@ } } }))); - addDoubleClick($(createdItem).find("td.phrase")); - addDoubleClick($(createdItem).find("td.weight")); + addDoubleClick($(createdItem).find("div.phrase")); + addDoubleClick($(createdItem).find("div.weight")); createdItem.on('keydown', function(ev){ if(ev.keyCode === 13) return false; }); @@ -317,12 +375,6 @@ obj["phrase"] = content_word; obj["weight"] = content_weight; localStorage.setItem(id, JSON.stringify(obj)); - for(var key in localStorage){ - if (key === null) - continue; - var json_string = localStorage.getItem(key); - console.log(key+' '+json_string); - } } } @@ -331,6 +383,9 @@ event.preventDefault(); var input_word = $('#text-pos'); word = input_word.val(); + if(wordAlreadyExists(1,word)) { + return false; + } var input_weight = $('#weight-pos'); weight = input_weight.val(); if (word && weight){ @@ -344,6 +399,9 @@ event.preventDefault(); var input_word = $('#text-neg'); word = input_word.val(); + if(wordAlreadyExists(0,word)) { + return false; + } var input_weight = $('#weight-neg'); weight = input_weight.val(); if (word && weight){ @@ -361,7 +419,7 @@ var deleteAllWords = function(warnUser = 1, is_pos) { if(!warnUser || confirm('Are you sure you want to delete all the items in the list? There is no turning back after that.')){ //remove items from DOM if (is_pos) { - var items = $('tr[id ^= positive]'); + var items = $('li[id ^= positive]'); items.addClass('removed-item').one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(e) { $(this).remove(); }); @@ -377,7 +435,7 @@ count_pos = 0; updateCounter(1); } else { - var items = $('tr[id ^= negative]'); + var items = $('li[id ^= negative]'); items.addClass('removed-item').one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(e) { $(this).remove(); }); @@ -403,43 +461,104 @@ }; var handleFiltersInput = function() { - $("#letter-case-select").on('change', function(e) { - localStorage.setItem('lettercase', $("#letter-case-select option:selected").text()); + $("#context-prev-words").on('change', function(e) { + localStorage.setItem('contextprev', $("#context-prev-words").val()); }); + $("#context-next-words").on('change', function(e) { + localStorage.setItem('contextnext', $("#context-next-words").val()); + }); + $("#letter-case-radio .uk-radio").each(function() {$(this).on('change', function(e) { + console.log("YEAH"); + localStorage.setItem('lettercase', $("#letter-case-radio input:checked").val()); + })}); $("#word-split").on('change', function(e) { localStorage.setItem('wordssplitnum', $("#word-split").val()); }); $("#stop-words-filter").on('change', function(e) { localStorage.setItem('stopwords', $('#stop-words-filter').prop('checked')===true?1:0); - console.log('stop-words-filter '+localStorage.getItem('stopwords')); }); $("#punctuation-filter").on('change', function(e) { localStorage.setItem('punctuation', $('#punctuation-filter').prop('checked')===true?1:0); - console.log('punctuation-filter '+localStorage.getItem('punctuation')); }); } + function highlightInElement(element, text){ + var elementHtml = element.html(); + var tags = []; + var tagLocations= []; + var htmlTagRegEx = /<{1}\/{0,1}\w+>{1}/; + + //Strip the tags from the elementHtml and keep track of them + var htmlTag; + while(htmlTag = elementHtml.match(htmlTagRegEx)){ + tagLocations[tagLocations.length] = elementHtml.search(htmlTagRegEx); + tags[tags.length] = htmlTag; + elementHtml = elementHtml.replace(htmlTag, ''); + } + + //Search for the text in the stripped html + var textLocation = elementHtml.search(text); + if(textLocation){ + //Add the highlight + var highlightHTMLStart = ""; + var highlightHTMLEnd = ""; + elementHtml = elementHtml.replace(text, highlightHTMLStart + text + highlightHTMLEnd); + + //plug back in the HTML tags + var textEndLocation = textLocation + text.length; + for(i=tagLocations.length-1; i>=0; i--){ + var location = tagLocations[i]; + if(location > textEndLocation){ + location += highlightHTMLStart.length + highlightHTMLEnd.length; + } else if(location > textLocation){ + location += highlightHTMLStart.length; + } + elementHtml = elementHtml.substring(0,location) + tags[i] + elementHtml.substring(location); + } + } + + //Update the innerHTML of the element + element.html(elementHtml); + return element; + } + var handleRunMiningButton = function() { $("#run-mining-btn").on('click', function( e ) { var formData = new FormData(); formData.append("poswords", JSON.stringify(wordsDataToArray(1))); formData.append("negwords", JSON.stringify(wordsDataToArray(0))); - formData.append("lettercase", $("#letter-case-select option:selected").text()); + formData.append("contextprev", $("#context-prev-words").val()); + formData.append("contextnext", $("#context-next-words").val()); + formData.append("lettercase", $("#letter-case-radio input:checked").val()); formData.append("wordssplitnum", $("#word-split").val()); formData.append("stopwords", $('#stop-words-filter').prop('checked')===true?1:0); formData.append("punctuation", $('#punctuation-filter').prop('checked')===true?1:0); - filters_list = {}; - filters_list["lettercase"] = $("#letter-case-select option:selected").text(); - filters_list["wordssplitnum"] = $("#word-split").val(); - filters_list["stopwords"] = $('#stop-words-filter').prop('checked')===true?1:0; - filters_list["punctuation"] = $('#punctuation-filter').prop('checked')===true?1:0; - formData.append("filters", JSON.stringify(filters_list)); + // filters_list = {}; + // filters_list["lettercase"] = $("#letter-case-select option:selected").text(); + // filters_list["wordssplitnum"] = $("#word-split").val(); + // filters_list["stopwords"] = $('#stop-words-filter').prop('checked')===true?1:0; + // filters_list["punctuation"] = $('#punctuation-filter').prop('checked')===true?1:0; + // formData.append("filters", JSON.stringify(filters_list)); $.ajax({ url: "configure-profile", type: 'POST', data: formData, - async: false, + async: true, + beforeSend: function () { + // UIkit.modal($("#wait-spinner-modal-center")).show(); + $("#wait-spinner-modal-center").css("display", "flex"); + $("#wait-spinner-modal-center").addClass("uk-open"); + + }, success: function (data) { + UIkit.modal($("#wait-spinner-modal-center")).hide(); + respond = JSON && JSON.parse(data).respond || $.parseJSON(data).respond; + UIkit.notification({ + message: respond, + status: 'success', + pos: 'top-center', + timeout: 5000 + }); obj = JSON && JSON.parse(data) || $.parseJSON(data); console.log(obj); // get poswords @@ -455,76 +574,110 @@ // get matches var matches = []; if (obj.hasOwnProperty("matches")) { + var matches_counter = 0; doc_matches = obj["matches"]; + $("#docs-results").empty(); for (var docname in doc_matches) { if (doc_matches.hasOwnProperty(docname)) { // create document section - var li = $('
  • '+docname+'

  • '); + var li = $('
  • '+docname+'

  • '); // create matches section word_matches = doc_matches[docname]; var accordion_content = $('
    '); + var doc_match_count = 1; for (var match in word_matches) { console.log(word_matches[match]); var result = word_matches[match]; - var paragraph = $('

    '+result.context.split(' ').map(function(x){return ""+x+"";}).join('')+'

    '); - // find center match string and surrounded text - var matched = paragraph.find(":contains('"+result.match+"')"); - var prev = matched.prev(); - var next = matched.next(); + // construct middle match + // Find center match + var match_regexp = new RegExp(result.match, "g"); + + + + + + + + + + // var paragraph = $('

    '+result.context.split(' ').map(function(x){return ""+x+"";}).join('')+'

    '); + // // find center match string and surrounded text + // var matched = paragraph.find(":contains('"+result.match+"')"); + // var prev = matched.prev(); + // var next = matched.next(); // get textwindows text as context var context = []; - var prev_context = []; - var next_context = []; - for (i = 0; prev.text()!=''; i++) { - if (i < 10) { - context.unshift(prev.text()); - } else { - prev_context.unshift(prev.text()); - } - prev = prev.prev(); - } - context.push(matched.text()); - for (i = 0; next.text()!=''; i++) { - if (i < 5) { - context.push(next.text()); - } else { - next_context.push(next.text()); - } - next = next.next(); - } + context.push(result.prev); + context.push(result.middle); + context.push(result.next); + + // var prev_context = []; + // var next_context = []; + // for (i = 0; prev.text()!=''; i++) { + // if (i < 10) { + // context.unshift(prev.text()); + // } else { + // prev_context.unshift(prev.text()); + // } + // prev = prev.prev(); + // } + // context.push(matched.text()); + // for (i = 0; next.text()!=''; i++) { + // if (i < 5) { + // context.push(next.text()); + // } else { + // next_context.push(next.text()); + // } + // next = next.next(); + // } + + // hightlight textwindow - context = $(''+context.join(' ')+''); + context = $(''+context.join(' ')+''); // hightlight positive words for (var index in poswords) { var search_regexp = new RegExp(poswords[index], "g"); - context.html(context.html().replace(search_regexp,""+poswords[index]+"")); + context.html(context.html().replace(search_regexp,""+poswords[index]+"")); } // hightlight acknowledgment keywords if (result.hasOwnProperty("acknmatch")) { var acknmatches = result["acknmatch"]; for (var index in acknmatches) { var search_regexp = new RegExp(acknmatches[index], "g"); - context.html(context.html().replace(search_regexp,""+acknmatches[index]+"")); + context.html(context.html().replace(search_regexp,""+acknmatches[index]+"")); } } // hightlight negative words for (var index in negwords) { var search_regexp = new RegExp(negwords[index], "g"); - context.html(context.html().replace(search_regexp,""+negwords[index]+"")); + context.html(context.html().replace(search_regexp,""+negwords[index]+"")); } - // hightlight matched phrase - var search_regexp = new RegExp(result.match, "g"); - context.html(context.html().replace(search_regexp,""+result.match+"")); + // TESTTTTTTTTT + context = highlightInElement(context, result.match); + + // // hightlight matched phrase + // var search_regexp = new RegExp(result.match, "g"); + // context.html(context.html().replace(search_regexp,""+result.match+"")); + + match_title = $('Match '+(matches_counter+1)+': '+result.match+''); + doc_match_count++; + matches_counter++; + accordion_content.append(match_title); // construct results paragraph to show - paragraph = $('

    '+prev_context.join(' ')+' '+context[0].outerHTML+' '+next_context.join(' ')+'

    '); - - li.append(paragraph); + paragraph = $('

    '+result.extraprev+' '+context[0].outerHTML+' '+result.extranext+'

    '); + accordion_content.append(paragraph); + li.append(accordion_content); } $("#docs-results").append(li); } } UIkit.accordion($("#docs-results")); + var prev_res_cnt = $("#results-number").html(); + $("#results-number").html(matches_counter+" matches found"); + if (prev_res_cnt != "") { + $("#results-number-previous").html(prev_res_cnt+" previously"); + } } $("#results-section").show(); // split all paragraphs to word spans @@ -549,8 +702,13 @@ // }); }, error: function (xhr, ajaxOptions, thrownError) { - $('#file-upload-response').html('File Failed to Upload!'+xhr.status) - // $('#file-uploaded')[0].checked = false; + UIkit.modal($("#wait-spinner-modal-center")).hide(); + UIkit.notification({ + message: xhr.status, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -567,20 +725,54 @@ } var hideInitialDocsUploadForm = function() { - console.log("AAAAAAAAA") + $(".cm-results-hide-pannel").hide(); $("#docs-more-btn").show(); $("#run-mining-btn").removeAttr('disabled').removeClass('disabled'); $('#documents-change-btn').addClass("uk-button"); $('#initial-docs-upload-form').attr("class", ""); + $('#initial-docs-upload-form').addClass("cm-docs-selection-form-dialog"); $('#initial-docs-upload-form').attr("uk-dropdown", "mode: click;"); $('#initial-docs-upload-form').appendTo("#documents-section"); UIkit.dropdown($("#initial-docs-upload-form")); - UIkit.dropdown($("#initial-docs-upload-form")).mode = "click"; + $("#initial-docs-upload-form").mode = "click"; + stickyResultsHeader = UIkit.sticky($("#cm-results-section-header"), { + top: 25, + showOnUp: true, + animation: "uk-animation-slide-top", + bottom: ".cm-results-section" + }); + console.log(stickyResultsHeader); + $("#initial-docs-upload-form").on('beforeshow', function () { + $(".cm-results-hide-pannel").show(); + $(".cm-header-hide-pannel").addClass("cm-header-shown"); + stickyResultsHeader.$destroy(); + stickyResultsHeader = UIkit.sticky($("#cm-results-section-header"), { + top: 25, + bottom: ".cm-results-section" + }); + }); + $("#initial-docs-upload-form").on('hidden', function () { + $(".cm-results-hide-pannel").hide(); + $(".cm-header-hide-pannel").removeClass("cm-header-shown"); + stickyResultsHeader.$destroy(); + stickyResultsHeader = UIkit.sticky($("#cm-results-section-header"), { + top: 25, + showOnUp: true, + animation: "uk-animation-slide-top", + bottom: ".cm-results-section" + }); + // stickyResultsHeader = UIkit.sticky($("#cm-results-section-header"), { + // top: 25, + // showOnUp: true, + // animation: "uk-animation-slide-top", + // bottom: ".cm-results-section" + // }); + }); handleRunMiningButton(); } var handleFileUploadInput = function() { - $("#docs-file-input").on('change', function() { + $("form#docs-file-input").on('change', function() { if ($('#docs-file-input')[0].value === "") { return false; } @@ -591,9 +783,19 @@ url: "configure-profile", type: 'POST', data: formData, - async: false, + async: true, + beforeSend: function () { + // UIkit.modal($("#wait-spinner-modal-center")).show(); + }, success: function (data) { -// TODO TODO TODO TODO TODO TODO check for error + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + respond = JSON && JSON.parse(data).respond || $.parseJSON(data).respond; + UIkit.notification({ + message: respond, + status: 'success', + pos: 'top-center', + timeout: 5000 + }); obj = JSON && JSON.parse(data).data || $.parseJSON(data).data; // console.log(obj); if (obj > 0) { @@ -605,8 +807,13 @@ } }, error: function (xhr, ajaxOptions, thrownError) { - $('#codes-file-upload-response').html('File Failed to Upload!'+xhr.status) - // $('#file-uploaded')[0].checked = false; + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + UIkit.notification({ + message: xhr.status, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -616,6 +823,59 @@ return false; }); + + var bar = document.getElementById('js-progressbar'); + UIkit.upload('.js-upload', { + url: 'configure-profile', + multiple: false, + name: 'upload', + loadStart: function (e) { + bar.removeAttribute('hidden'); + bar.max = e.total; + bar.value = e.loaded; + }, + progress: function (e) { + bar.max = e.total; + bar.value = e.loaded; + }, + loadEnd: function (e) { + bar.max = e.total; + bar.value = e.loaded; + }, + completeAll: function (data) { + console.log(data.responseText); + setTimeout(function () { + bar.setAttribute('hidden', 'hidden'); + }, 1000); + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + respond = JSON && JSON.parse(data.responseText).respond || $.parseJSON(data.responseText).respond; + UIkit.notification({ + message: respond, + status: 'success', + pos: 'top-center', + timeout: 5000 + }); + obj = JSON && JSON.parse(data.responseText).data || $.parseJSON(data.responseText).data; + // console.log(obj); + if (obj > 0) { + if (uploadedDocs == 0) { + hideInitialDocsUploadForm(); + } + docsUploaded(obj); + UIkit.dropdown($("#initial-docs-upload-form")).hide(); + } + }, + error: function (xhr, ajaxOptions, thrownError) { + $('#codes-file-upload-response').html('File Failed to Upload!'+xhr.responseText) + // $('#file-uploaded')[0].checked = false; + UIkit.notification({ + message: xhr.responseText, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); + } + }); } var handleDocSampleChoice = function(btnIndex) { @@ -633,9 +893,19 @@ url: "configure-profile", type: 'POST', data: formData, - async: false, + async: true, + beforeSend: function () { + // UIkit.modal($("#wait-spinner-modal-center")).show(); + }, success: function (data) { -// TODO TODO TODO TODO TODO TODOcheck for error + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + respond = JSON && JSON.parse(data).respond || $.parseJSON(data).respond; + UIkit.notification({ + message: respond, + status: 'success', + pos: 'top-center', + timeout: 5000 + }); obj = JSON && JSON.parse(data).data || $.parseJSON(data).data; if (obj > 0) { if (uploadedDocs == 0) { @@ -646,8 +916,13 @@ } }, error: function (xhr, ajaxOptions, thrownError) { - $('#codes-file-upload-response').html('File Failed to Upload!'+xhr.status) - // $('#file-uploaded')[0].checked = false; + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + UIkit.notification({ + message: xhr.status, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -675,7 +950,9 @@ formData.append("poswords", JSON.stringify(wordsDataToArray(1))); formData.append("negwords", JSON.stringify(wordsDataToArray(0))); filters_list = {}; - filters_list["lettercase"] = $("#letter-case-select option:selected").text(); + filters_list["contextprev"] = $("#context-prev-words").val(); + filters_list["contextnext"] = $("#context-next-words").val(); + filters_list["lettercase"] = $("#letter-case-radio input:checked").val(); filters_list["wordssplitnum"] = $("#word-split").val(); filters_list["stopwords"] = $('#stop-words-filter').prop('checked')===true?1:0; filters_list["punctuation"] = $('#punctuation-filter').prop('checked')===true?1:0; @@ -684,8 +961,12 @@ url: "save-profile", type: 'POST', data: formData, - async: false, + async: true, + beforeSend: function () { + // UIkit.modal($("#wait-spinner-modal-center")).show(); + }, success: function (data) { + // UIkit.modal($("#wait-spinner-modal-center")).hide(); console.log(data) // if (data.indexOf('successfully!') != -1) { // $('#file-uploaded')[0].checked = true; @@ -693,8 +974,13 @@ window.location="save-profile" }, error: function (xhr, ajaxOptions, thrownError) { - $('#file-upload-response').html('File Failed to Upload!'+xhr.status) - // $('#file-uploaded')[0].checked = false; + // UIkit.modal($("#wait-spinner-modal-center")).hide(); + UIkit.notification({ + message: xhr.status, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -706,9 +992,9 @@ $("#next-button").on('click', function(e) { handleSaveProfileInfoSend(); }); - $("#save-profile-option").on('click', function(e) { - handleSaveProfileInfoSend(); - }); + // $("#save-profile-option").on('click', function(e) { + // handleSaveProfileInfoSend(); + // }); } var checkAlreadyUploadedDocs = function() { @@ -725,14 +1011,16 @@ if (obj > 0) { hideInitialDocsUploadForm(); docsUploaded(obj); - } else if (obj == -1) { - localStorage.clear(); } init(); }, error: function (xhr, ajaxOptions, thrownError) { - $('#codes-file-upload-response').html('File Failed to Upload!'+xhr.status) - // $('#file-uploaded')[0].checked = false; + UIkit.notification({ + message: xhr.status, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -741,6 +1029,7 @@ } var checkAlreadyMiningSettings = function() { + console.log(localStorage) for (var key in localStorage) { if (key === null) continue; @@ -754,9 +1043,13 @@ addDataToTable(key, data.phrase, data.weight, 0); } else if (key === 'matchlevel') { console.log(key+' '+value); - $(value).click(); + handlePreccisionMode(value); + } else if (key === 'contextprev') { + $("#context-prev-words").val(value); + } else if (key === 'contextnext') { + $("#context-next-words").val(value); } else if (key === 'lettercase') { - $("#letter-case-select").val(value); + $('#letter-case-radio input.'+value).prop('checked', true); } else if (key === 'wordssplitnum') { $("#word-split").val(value) } else if (key === 'stopwords') { @@ -789,7 +1082,10 @@ } } + var stickyResultsHeader = null; + var init = function(){ + $("#child1").stickySidebar(); handleMatchLevelChoice(); checkAlreadyMiningSettings(); handleWordsInput(); diff --git a/interactive-mining-madoap/madoap/src/static/custom.css b/interactive-mining-madoap/madoap/src/static/custom.css index ef73792..5b89990 100644 --- a/interactive-mining-madoap/madoap/src/static/custom.css +++ b/interactive-mining-madoap/madoap/src/static/custom.css @@ -6,6 +6,14 @@ .tm-toolbar .uk-subnav-line .custom-discover-li a{ color:#05007A !important; } +.tm-toolbar .uk-subnav-line .custom-connect-li { + color:#05007A !important; + background:#fff; + display: block; +} +.tm-toolbar .uk-subnav-line .custom-connect-li a{ + color:#05007A !important; +} .custom-discover-toolbar ul.uk-subnav.uk-subnav-line{ background-color: #f25f30 !important; } @@ -17,6 +25,17 @@ .custom-discover-toolbar{ border-top-color:#f25f30 !important; } +.custom-connect-toolbar ul.uk-subnav.uk-subnav-line{ + background-color: #ffc800 !important; + } + + .custom-connect-toolbar .inner { + background-color: #ffc800 !important; + } + + .custom-connect-toolbar{ + border-top-color:#ffc800 !important; + } .custom-footer{ position:relative; bottom:0; diff --git a/interactive-mining-madoap/madoap/src/static/database.db b/interactive-mining-madoap/madoap/src/static/database.db index 57780be50830806bef2c3cb7857275a38b521db5..70904033c190f07126c03b592831dbeb134453e0 100644 GIT binary patch delta 100 zcmZo@U~Fh$nINsm&%nUI0>n%}%nZa_5I*+~APoYH6AP7v`5AOS?%)M+9T*tw=h}U- g`?9g{mL22viG{m3K{`PuFmEjEx8K;%0L6)n09H>Hi2wiq delta 56 vcmZo@U} :before { + content: none; + display: block; + /* display: inline-block*/ + height: 10px; + vertical-align: middle +} + +.uk-subnav-line > :nth-child(n + 2):before { + margin-right: 10px; + border-left: 0px ; +} + +.cm-navigation .uk-subnav-line li a{ + display: block; + text-decoration:none; + transform: skew(-25deg); + font-family:Roboto:900!important; + text-transform:uppercase!important; + font-size:13px!important; + opacity:1!important; + color:#05007A!important; + +} +.cm-navigation .uk-subnav-line li:hover { + color:#05007A!important; + background:#fff; + display: block; +} + + + +.cm-navigation .uk-subnav-line li a:hover, +.cm-navigation .uk-subnav-line li:hover a{ + display: block; + color:#05007A!important; +} + +.cm-navigation .uk-dotnav, .cm-navigation .uk-subnav { + margin-bottom:0px!important; +} +.cm-nav-container { + width: 100%; + border-style: solid; + border-width: 0px 0px 5px 0px; + border-bottom-color: #ffc800 !important; + box-shadow: 0px 10px 16px 0px #fff3d1; +} +.cm-left-box { + background-color: #ffc800; + padding: 10px 89px 10px 41px; +} +.cm-nav-toolbar { + border-width: 0px 0px 0px 0px; +} +.cm-nav-toolbar ul.uk-subnav.uk-subnav-line { + background-color: #ffc800 !important; +} +/*.cm-navigation .uk-subnav-line .cm-nav-li { + color: #05007A !important; + background: #fff; + display: block; +}*/ +.cm-nav-li { + padding: 0; + background-color: #ffc800 !important; +} +.cm-nav-li:hover { + background-color: #fff !important; +} +.cm-nav-li:hover { + background-color: #fff !important; +} +.cm-nav-li a { + padding: 0; +} +.cm-nav-number-container { + margin-left: -1px; + padding: 8px 13px 3px 40px; + background-color: #ffc800; + transform: skew(25deg); + display: inline-block; + color: #05007A; +} +.cm-nav-li-number { + padding: 5px 15px 5px 25px; +} +.cm-nav-number { + font-size: x-large; + font-weight: bold; + display: inline-block; + line-height: 1.5; + transform: skew(-25deg); +} +.cm-nav-title { + display: inline-block; + padding: 0px 20px 0px 20px; + line-height: 1.4; +} +.cm-nav-active { + background-color: #fff !important; +} +.cm-nav-active .cm-nav-title { + color: #05007A !important; +} +.cm-nav-disabled, +.cm-nav-disabled:hover, +.cm-nav-disabled .cm-nav-number-container { + background-color: #fce39a !important; + color: #91919d; + cursor: default; +} +.cm-nav-disabled a { + cursor: default; +} +.cm-nav-disabled span.cm-nav-title { + color: #91919d; +} +/* Custom File drop Area Upload + ========================================================================== */ +.cm-file-drop-area { + background-color: #fef4d7; + border: 1px dashed #f9c735; + font-weight: 500; +} +/* Custom Inputs + ========================================================================== */ +#initial-type-input { + border: 2px solid #f9c735; + font-weight: bold !important; + padding: 28px; + border-radius: 3px; + font: inherit; +} +.cm-text-input:-ms-input-placeholder { + color: #aaa !important; +} +.cm-text-input::-moz-placeholder { + color: #aaa; + opacity: 1; +} +.cm-text-input::-webkit-input-placeholder { + color: #aaa; +} + +/* Custom Table + ========================================================================== */ +.cm-table { + border-collapse: collapse; + /*border-radius: 3px;*/ + border-style: hidden; /* hide standard table (collapsed) border */ + box-shadow: 0 0 0 1px #f7c800; /* this draws the table border */ +} +.cm-table td, .cm-table th { + padding: 16px 20px; + -webkit-transition: color .1s linear; + transition: color .1s linear; +} +.cm-table td.code, .cm-table td.acknowl, .cm-table td.delete, .cm-table td.edit, .cm-table-footer { + border-top: 1px solid #e8e8e8; + font-weight: 400; +} +.cm-table td.code:hover, .cm-table td.acknowl:hover, .cm-table td.edit:hover a { + color: #55546d; + cursor: pointer; +} +.cm-table thead tr { + background-color: #fef4d7; +} +.cm-table tr th { + color: #5b6065; + font-weight: bold; +} +.cm-table-number { + background-color: #fbe39a; + border-right: 1px solid #f7c800; +} +.empty:before { + content: "Empty field"; + color: #ccc; +} +.cm-tooltip { + width: 15px; + display: inline-flex; +} +/* Custom config section + ========================================================================== */ +.cm-config-settings-section { + /*overflow: auto; + -webkit-overflow-scrolling: touch; + height: 841px;*/ + max-width: 850px !important; + min-width: 460px !important; + width: 35% !important; +} +.cm-config-section { + +} +.cm-easy-config-section { + padding: 20px; +} +.cm-config-options-container { + display: block; + margin-top: -10px; +} +.cm-config-options-connect-line { + margin: auto; + display: block; + position: relative; + top: 29px; + background-color: #ececec; + z-index: -1; + width: 70%; + height: 8px; + box-shadow: 0px 2px 0px #dedede; + /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#72bbd6+0,617dd3+50,5243a7+100 */ + background: #72bbd6; /* Old browsers */ + background: -moz-linear-gradient(left, #72bbd6 0%, #617dd3 50%, #5243a7 100%); /* FF3.6-15 */ + background: -webkit-linear-gradient(left, #72bbd6 0%,#617dd3 50%,#5243a7 100%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to right, #72bbd6 0%,#617dd3 50%,#5243a7 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#72bbd6', endColorstr='#5243a7',GradientType=1 ); /* IE6-9 */ +} +.cm-config-option { + display: block; +} +/*.cm-config-light .cm-circle-button { + background-color: #58bd87; +} +.cm-config-medium .cm-circle-button { + background-color: #269487; +} +.cm-config-hard .cm-circle-button { + background-color: #324b7f; +} +.cm-config-advance .cm-circle-button { + background-color: #161264; +}*/ +.cm-config-light .cm-circle-button, .cm-config-option:hover.cm-config-light .cm-outer-circle-button, .cm-config-option.cm-config-light.active .cm-outer-circle-button { + background-color: #72bbd6; +} +.cm-config-medium .cm-circle-button, .cm-config-option:hover.cm-config-medium .cm-outer-circle-button, .cm-config-option.cm-config-medium.active .cm-outer-circle-button { + background-color: #617dd3; +} +.cm-config-hard .cm-circle-button, .cm-config-option:hover.cm-config-hard .cm-outer-circle-button, .cm-config-option.cm-config-hard.active .cm-outer-circle-button { + background-color: #5243a7; +} +.cm-config-advance .cm-circle-button, .cm-config-option:hover.cm-config-advance .cm-outer-circle-button, .cm-config-option.cm-config-advance.active .cm-outer-circle-button { + background-color: #161264; +} +.cm-config-option:hover .cm-circle-button, .cm-config-option.active .cm-circle-button { + background-color: #efefef; +} +/*.cm-config-option:hover .cm-circle-button-fill, .cm-config-option.active .cm-circle-button-fill { + background-color: rgba(255, 255, 255, 0.39); +}*/ +.cm-outer-circle-button { + background-color: transparent; + margin: 0 auto; + height: 50px; + width: 50px; + border-radius: 45px; + position: relative; + -webkit-transition: .1s ease-in-out; + transition: .1s ease-in-out; +} +.cm-circle-button { + height: 30px; + width: 30px; + top: 10px; + left: 10px; + border-radius: 45px; + position: absolute; + -webkit-transition: .1s ease-in-out; + transition: .1s ease-in-out; +} +.cm-circle-button-fill { + width: 16px; + height: 16px; + border-radius: 45px; + position: absolute; + top: 7px; + left: 7px; + background-color: #efefef; +} +.cm-config-option span { + font-weight: normal; + font-family: Roboto; + text-transform: uppercase; + vertical-align: middle; + font-size: 13px; + text-align: center; + -webkit-transition: .1s ease-in-out; + transition: .1s ease-in-out; + color: #c7c6c6; +} +.cm-config-option:hover span, .cm-config-option.active span { + color: #565656; + text-decoration: none; +} +.cm-config-option-check { + display: none; + position: absolute; + left: -1px; + top: -1px; + color: black; +} +.cm-config-option.active .cm-config-option-check { + display: block; +} +.cm-advanced-tools-section { + padding: 0px 20px 20px 20px; + min-height: 296px; +} +.cm-advanced-tools-section .uk-accordion-title { + font-size: 16px; +} +.cm-advaned-tools-label { + line-height: 1.4; + font-size: 18px; + font-weight: 700; + text-transform: uppercase; +} +/*.cm-prhases { + min-width: 350px !important; + margin-top: 40px !important; +}*/ +.cm-phrases-container { + border-collapse: collapse; + border-radius: 3px; + border-style: hidden; /* hide standard table (collapsed) border */ + box-shadow: 0 0 0 1px #f7c800; /* this draws the table border */ +} +.cm-phrases-container header { + background-color: #fafafa; + color: #5b6065; + font-weight: bold; + border-bottom: 1px solid #e8e8e8; +} +.cm-phrases-container ul { + height: 180px; + overflow-y: scroll; + overflow-x: hidden; + margin: 0; +} +.cm-phrases-container ul li { + padding: 0; + border: none; +} +.cm-number-space, .cm-phrases-container ul li .num { + background-color: #fafafa; + border-right: 1px solid #e8e8e8; + width: 40px; + padding: 12px 0px; + font-size: 14px; +} +.cm-text-input-phrase, .cm-text-input-weight { + height: 34px; + border: 1px solid #f7c800; + font-weight: bold !important; + text-indent: 8px; + border-radius: 5px; + font: inherit; + margin: 5px 0px 5px 5px; +} +.cm-text-input-weight { + width: 80px; +} +.cm-phrases-container .weight { + width: 95px; +} +.cm-phrases-container footer { + padding: 6px 6px 6px 20px; +} +.cm-phrases-container footer.positive { + background-color: #c0ff94; +} +.cm-phrases-container footer.negative { + background-color: #ffbfc9; +} +.cm-phrases-container ul li:hover { + background: #ffd; +} +.cm-phrases-container ul li .phrase, .cm-phrases-container ul li .weight { + padding: 6px 0px 6px 13px; + line-height: 1.5; + border-bottom: 1px solid #e8e8e8; + font-weight: 400; +} +.cm-phrases-container ul li .phrase:hover, .cm-phrases-container ul li .weight:hover { + color: #00a0de; + text-decoration: underline; + cursor: default; +} +.cm-phrases-container ul li .erase { + width: 55px; + border-bottom: 1px solid #e8e8e8; +} +.cm-match-area { + padding: 7px; + border: 1px solid #f7c800; + margin-top: -1px; +} +.cm-match-area.left, .cm-match-area.right { + background-color: #ffff94; +} +.cm-match-area.middle { + background-color: #bedfff; +} + +/* Custom Results Section + ========================================================================== */ +.cm-results-section { + background-color: rgb(242, 242, 242); + min-height: 700px; + position: relative; + border-bottom: 1px solid #f7c800; + border-left: 1px solid #f7c800; +} +.cm-results-section header { + padding: 0; + -webkit-transition: box-shadow 500ms; + transition: box-shadow 500ms; +} +.cm-results-section header.uk-sticky-fixed { + background-color: transparent !important; + box-shadow: rgba(0, 0, 0, 0.07) 0px 3px 0px; +} +.cm-results-controls { + padding: 40px 20px 20px 20px; +} +header.uk-sticky-fixed .cm-results-controls { + background-color: rgb(242, 242, 242) !important; + padding: 20px; +} +.cm-results-count-section { + padding: 5px 20px 20px 20px; +} +header.uk-sticky-fixed .cm-results-count-section { + background-color: rgba(245, 245, 245, 0.8) !important; + padding: 5px 20px 5px 20px; +} +.cm-text-muted { + color: #737373 !important; +} +.cm-results-rows { + /*overflow: auto; + -webkit-overflow-scrolling: touch; + height: 600px;*/ + padding: 0px 20px 40px 20px; +} +.cm-results-rows .match { + font-weight: bold; + color: #336699; +} +.cm-document-result { + margin-top: 5px; +} +.cm-document-result .textwindow { + background-color: #ffff94; + color: #555; +} +.cm-document-result .highlight { + font-weight: bold; + background-color: #bedfff; + padding: 2px 8px; + color: #222; +} +.cm-document-result .negative { + background-color: #ffbfc9; +} +.cm-document-result .positive { + background-color: #c0ff94; +} +.cm-results-hide-pannel { + height: 100%; + width: 100%; + position: absolute; + top: 0; + right: 0; + background-color: rgba(0, 0, 0, 0.5); +} +.cm-header-hide-pannel { + display: none; + height: 100%; + width: 100%; + position: absolute; + top: 0; + right: 0; + background-color: rgba(0, 0, 0, 0.5); +} +.uk-sticky-fixed .cm-header-hide-pannel.cm-header-shown { + display: block; +} +.cm-save-profile-step { + /*position: absolute; + bottom: -60px; + right: 0;*/ + line-height: 38px; +} +/* Custom Docs selection form + ========================================================================== */ +.cm-docs-selection-form { + margin: 0 auto; + display: block; + position: relative; + z-index: 1020; + box-sizing: border-box; + min-width: 500px; + padding: 35px; + background: #fff; + color: #767779; + border-radius: 2px; + box-shadow: 0 3px 12px rgba(0,0,0,0.07); +} +.cm-docs-selection-form-dialog { + min-width: 700px; +} +/* Custom labels + ========================================================================== */ +.cm-label { + display: inline-block; + padding: 1px 7px; + background: #8688a5; + line-height: 1.625; + font-size: 12px; + color: #fff; + vertical-align: middle; + white-space: nowrap; + font-family: Roboto; + font-weight: normal; + text-transform: uppercase; + border-radius: 2px; + margin-right: 5px; +} +/* Custom text + ========================================================================== */ +.cm-coloured-text { + color: #64667f; +} + +#parent { + position: relative; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: start; + -webkit-align-items: start; + align-items: start; + margin-bottom: 64px; +} +#child1 { + padding-top: 20px; + -webkit-flex: 0.35; + flex: 0.35; + will-change: min-height; +} +#child1.is-affixed { + padding-top: 0px; +} +#child1-inner { + transform: translate(0, 0); /* For browsers don't support translate3d. */ + transform: translate3d(0, 0, 0); + will-change: position, transform; + padding-bottom: 20px; + border-bottom: 1px solid #f7c800; + border-right: 1px solid #f7c800; + margin-right: -1px; + min-height: 640px; +} +#child2 { + position: relative; + -webkit-flex: 1; + flex: 1; + right: 0; } \ No newline at end of file diff --git a/interactive-mining-madoap/madoap/src/static/upload-codes.js b/interactive-mining-madoap/madoap/src/static/upload-codes.js index 772f79a..a037bb2 100644 --- a/interactive-mining-madoap/madoap/src/static/upload-codes.js +++ b/interactive-mining-madoap/madoap/src/static/upload-codes.js @@ -51,11 +51,10 @@ } var handleAddRowButton = function() { - $('#add-row-below').on('click', function( e ) { + $('#add-row-below').on('focus', function( e ) { var newId = generateId(); addDataToTable(newId, "", ""); - var currentEle = $('#'+ newId).find("td.code"); - editValue(currentEle, " ", 0); + $('#'+ newId).find("td.code").trigger("click"); }); } @@ -74,8 +73,14 @@ window.location="configure-profile" }, error: function (xhr, ajaxOptions, thrownError) { - $('#file-upload-response').html('File Failed to Upload!'+xhr.status) + $('#file-upload-response').html('File Failed to Upload!'+xhr.responseText) // $('#file-uploaded')[0].checked = false; + UIkit.notification({ + message: xhr.responseText, + status: 'danger', + pos: 'top-center', + timeout: 0 + }); }, cache: false, contentType: false, @@ -100,35 +105,87 @@ var clickedElement=null; var saveEditBox = function(element) { - var new_val = $(".thVal").val(); - $(element).html($(".thVal").val().trim()); + codeElement = element.find(".code"); + ackowElement = element.find(".acknowl"); + codeElement2 = element.find(".code .thVal"); + ackowElement2 = element.find(".acknowl .thVal"); + var codeValue2 = codeElement2.val().trim(); + var ackowValue2 = ackowElement2.val().trim(); + $(codeElement).html(codeValue2); + $(ackowElement).html(ackowValue2); + if (codeValue2 == "") { + codeElement.addClass("empty"); + } + if (ackowValue2 == "") { + ackowElement.addClass("empty"); + } } - var editValue = function(currentEle, value, isArea) { + var editValue = function(currentEle, target) { clickedElement = currentEle; + // Locate code ande acknow + codeElement = currentEle.find(".code"); + ackowElement = currentEle.find(".acknowl"); + // remove empty class if any + codeElement.removeClass("empty"); + ackowElement.removeClass("empty"); $(document).off('click'); - if (isArea) { - $(currentEle).html(''); + // get elements lines number + var divHeight = ackowElement.outerHeight(true); + var lineHeight = parseInt(ackowElement.css('line-height')); + var lines = divHeight / lineHeight; + + var codeValue = codeElement.html(); + input1 = $(''); + input1.val(codeValue); + $(codeElement).html(input1); + + + var ackowValue = ackowElement.html(); + input2 = $('