[owncloud-devel] [app] Workin2gether - support request

Vincent Petry pvince81 at owncloud.com
Tue Mar 4 14:10:55 MET 2014


Hi Patrick,

Glad to hear it's working.

I don't really have time right now to review your app in detail, sorry.

If it already works as intended then you might not need to worry too 
much about cleaning up the code for your first version.

Good luck!

Vincent

On 03/04/2014 01:31 PM, Hoffmann, Patrick wrote:
> Hi Vincent,
>
> Hi Vincent,
>
> just wanted to let you know that my app is now working :-)
>
> But now the cleanup progress starts and some things are really messy coded.
>
> So I could need some tipps, because I recognized that you are really fit with jQuery and OC.
>
> Here you can see the current state: http://imgbox.com/ZFjqBuyh . It locks all other fileactions and
> marks the line in a color. But i will add more options later.
>
> If you have some ideas to shorten the code please feel free to answer.
>
> Here is my filetree:
> +apps
> -+ajax
>    - l10n.php (grab translation with ajax)
>    - workin2gether.php (the core)
> -+appinfo
>   -app.php
>   -info.xml
> -+css
>    -styles.css
> -+img
>    -pattern.png
>    -w2g.svg
>    -whoshare.png
> -+js
>    -workin2gether.js
> -+l10n
>    -<somelanguages>
> -+lock (where the locks are stored)
>
> Source: workin2gether.js
>
> var text = "";
> var lockedtext = "";
> var lockstate = "";
>
> $(document).ready(function(){
>
>          text = translate("filelock");
>          lockedtext = translate("File is locked");
>          lockstate = translate("Status: locked");
>
>      if (typeof FileActions !== 'undefined' && $('#dir').length>0) {
>
>
>              FileActions.register('file',text,OC.PERMISSION_READ,function(){return OC.imagePath('files_w2g','w2g.svg')},function(filename){
>                  getState(filename,"false");
>              });
>
>              FileActions.register('dir',text,OC.PERMISSION_READ,function(){return OC.imagePath('files_w2g','w2g.svg')},function(filename){
>                  getState(filename,"false");
>              });
>
>                          $('#fileList').on('fileActionsReady',function(filename){
>                                  $('#fileList tr td.filename a.name span.nametext').each(function() {
>                                          var $tr = $(this);
>                                          getState($tr.html(),"true");
>                                  });
>                          });
>      }
>
> });
>
> function disable_control(filename)
> {
>
>          $('#fileList tr').each(function() {
>
>                  var $tr = $(this);
>
>                  var $_tr = $tr.html().replace(/^\s+|\s+$/g, '').replace('<span class="extension">','').replace('</span>','');
>
>                      if($_tr.indexOf(lockedtext)!=-1||$_tr.indexOf(lockstate)!=-1)
>                      {
>                                  if($_tr.indexOf(filename)!=-1)
>                                          $tr.find('a.action[data-action!='+text+']').addClass('locked');
>                                          $tr.find('a.name').addClass('statelock');
>                                          $tr.find('td.filesize').addClass('statelock');
>                                          $tr.find('td.date').addClass('statelock');
>
>                          }
>          });
> }
>
> function enable_control(filename)
> {
>          $('#fileList tr').each(function() {
>
>                  var $tr = $(this);
>
>                  var $_tr = $tr.html().replace(/^\s+|\s+$/g, '').replace('<span class="extension">','').replace('</span>','');
>
>                      if($_tr.indexOf(lockedtext)==-1 && $_tr.indexOf(lockstate)==-1)
>                      {
>                                  if($_tr.indexOf(filename)!=-1)
>                                          $tr.find('a.action[data-action!='+text+']').removeClass('locked');
>                                          $tr.find('a.name').removeClass('statelock');
>                                          $tr.find('td.filesize').removeClass('statelock');
>                                          $tr.find('td.date').removeClass('statelock');
>                          }
>          });
> }
>
> function translate(text)
> {
>          $.ajax({
>          url: OC.filePath('files_w2g','ajax','l10n.php'),
>          type: "post",
>          data: { rawtext: text},
>                  async: false,
>          success: function(data){text = data;},
>      });
>          return text;
> }
>
> function getState(filename,_safe)
> {
>          filename = filename.replace(/^\s+|\s+$/g, '').replace('<span class="extension">','').replace('</span>','');
>
>      oc_dir = $('#dir').val();
>          filename = filename.replace(/ /g, "%20");
>          oc_path = oc_dir +'/'+filename;
>
>
>          $.ajax({
>          url: OC.filePath('files_w2g','ajax','workin2gether.php'),
>          type: "post",
>          data: { path: oc_path, safe: _safe},
>          success: function(data){postmode(filename,data)},
>      });
>
> }
>
> function postmode(filename,data)
> {
>                  filename = filename.replace(/%20/g,' ');
>
>                  var html = '<img class="svg" src="'+OC.imagePath('files_w2g','w2g.svg')+'"></img> '+data;
>                  $('tr').filterAttr('data-file',filename).find('td.filename').find('a.name').find('span.fileactions').find("a.action").filterAttr('data-action',text).html(html);
>
>                  if(data==lockedtext||data==lockstate)
>                          disable_control(filename);
>                  else
>                          enable_control(filename);
>
> }
>
>
> Source: workin2gether.php
> <?php
>
> //Init translations
> $l = \OCP\Util::getL10N('files_w2g');
>
> //Requirements check
> OCP\JSON::checkLoggedIn();
> OCP\JSON::checkAppEnabled('files_w2g');
>
>
> //Default path for lock files
>
> $root = $_SERVER['DOCUMENT_ROOT'];
>
> $apath = $root.OCP\Util::linkTo('files_w2g', 'lock')."/";
>
> if(!@file_exists($root.OCP\Util::linkTo('files_w2g')."/lock"))
>          @mkdir($root.OCP\Util::linkTo('files_w2g')."/lock", 0777, true);
>
> $storage = "D:/";
>
> //Vars
> $path = stripslashes($_POST['path']) ;
> @$safe = @$_POST['safe'];
> $ppath = lockname($path);
>
>
> if(cleanPath($path)=="/Shared"){ echo "Forbidden"; return 1; }
>
> if(substr(cleanPath($path),0,7)=="/Shared")
> {
>          // /Shared/...
>          $relpath = explode('/',substr(cleanPath($path),7,strlen($path)-7));
>          $relative_path = '/'.$relpath[count($relpath)-1];
>
>          $backcount = 0;
>          $dbg = $relpath[count($relpath)-1-0];
>          do
>          {
>                  $query = OCP\DB::prepare("SELECT X.parent, X.id, X.uid_owner, Y.path FROM *PREFIX*share X INNER JOIN *PREFIX*filecache Y ON X.file_source = Y.fileid where X.share_with = ? and X.file_target = ? LIMIT 1");
>                  $result = $query->execute(array(OCP\USER::getUser(),'/'.$relpath[count($relpath)-1-$backcount]))->fetchAll();
>                  $backcount+=1;
>          }while(count($result)<1 && $backcount<count($relpath));
>
>          if ($backcount>0) $backcount-=1;
>
>
>
>
>          $user = $result[0]['uid_owner'];
>          $postpath = $result[0]['path'];
>          //get the original share user name
>
>          $old = ""; $new = "-";
>          while ($new!="")
>          {
>                  $old = $new;
>                  $query = OCP\DB::prepare("SELECT parent, uid_owner, id FROM *PREFIX*share where id = ? LIMIT 1");
>                  $result = $query->execute(array($result[0]['parent']))->fetchAll();
>                  $new = $result[0]['uid_owner'];
>          }
>          if($old!="-") $user = $old;
>
>
>          $realpath = $storage.$user.'$'.$postpath;
>
>          for($i=$backcount;$i>0;$i-=1)
>          {
>                  $realpath .= '/'.$relpath[count($relpath)-$i];
>          }
>
>
>
> }
> else $realpath = $storage.OCP\USER::getUser()."/files".cleanPath($path);
>
> //lockfile name
> $lock = $apath.lockname($realpath);
>
> if (file_exists($lock))
> {
>          if(@$safe=="false")
>          {
>                  @unlink($lock);
>                  echo $l->t("File not locked");
>          }
>          else echo $l->t("Status: locked");
> }
> else
> {
>          @date_default_timezone_set('Europe/Berlin');
>
>          if(@$safe=="false")
>          {
>                  $h = fopen($lock, "w");
>                  fwrite($h,OCP\User::getDisplayName()." ".date(DATE_RFC822)." ".$path);
>                  fclose($h);
>                  echo $l->t("File is locked");
>          }
>          else echo $l->t("Status: not locked");
> }
>
>
>
> function lockname($path)
> {
>          //Replace all '/' with $ for a filename for the lock file
>          $ppath = str_replace("/","$",cleanPath($path))."$";
>
>          $ppath = str_replace("Shared","",$ppath);
>          $ppath = str_replace(":","#",$ppath);
>
>          //Remove double dollar char when exist
>          if ($ppath[0] == "$" and $ppath[1] == "$") $ppath = substr($ppath,1);
>
>          return $ppath;
>
> }
>
> function cleanPath($path) {
>
>          $path = rtrim($path, "/");
>          $path = urldecode($path);
>                  return preg_replace('{(/)\1+}', "/", $path);
> }
>
>
> Source: l10n.php
> <?php
> $l = \OCP\Util::getL10N('files_w2g');
> if($l->t($_POST['rawtext'])!="") echo $l->t($_POST['rawtext']); else echo $_POST['rawtext'];
>
>
> Source: styles.css
> #workin2gether p {
>          float: left;
>          padding-top: 0.8em;
>          padding-left: 1.2em;
> }
>
> #workin2gether img  {
>          float: left;
>          width: 48px;
>          height: 48px;
>          background: transparent url('apps/files_w2g/img/pattern.png');
>          border: 1px solid #D8D8D8;
>          padding: 5px;
> }
> a.action.locked{
> display:none !important;
> }
>
> a.name.statelock a.action{
> color:#eee;
> opacity:1 !important;
> }
> a.name.statelock a.action:hover, a.name.statelock span.extension{
> color:#fff;
> }
>
> .statelock, .statelock span.modified{
> background-color:#008887;
> color:#fff !important;
> }
>
> Source: sample language file (de.php)
> <?php
> $TRANSLATIONS = array(
> "File not locked" => "Datei nicht gesperrt",
> "File is locked" => "Datei ist gesperrt",
> "Status: locked" => "Status: gesperrt",
> "Status: not locked" => "Status: nicht gesperrt",
> "filelock" => "Dateisperre"
> );
>
> Example for Lockname:
> D#$Patrick$files$_locked_folder$
>
> Cheers,
>
> Patrick
>
>
> BITO-Lagertechnik Bittmann GmbH
>
> Obertor 29
> 55590 Meisenheim
> Germany
>
> Tel: +49 (0) 6753 122 0
> Fax: +49 (0) 6753 122 399
>
> E-Mail: info at bito.de
> http://www.bito.de
>
> Gesch?ftsf?hrer: Werner Magin, Winfried Schmuck | HRB 2704 Bad Kreuznach | Gesellschafter: Fritz Bittmann Holding GmbH | USt-ID: DE 811 202 181
>
>
> *************************************************************************************
> Dieses E-Mail ist nur f?r den Empf?nger bestimmt, an den es gerichtet ist und kann vertrauliches bzw. unter das Berufsgeheimnis fallendes Material enthalten. Jegliche darin enthaltene Ansicht oder Meinungs?u?erung ist die des Autors und stellt nicht notwendigerweise die Ansicht oder Meinung von BITO-Lagertechnik Bittmann GmbH dar. Sind Sie nicht der Empf?nger und haben diese E-Mail irrt?mlich erhalten, sind jegliche Verwendung, Ver?ffentlichung, Weiterleitung, Abschrift oder jeglicher Druck dieser E-Mail strengstens untersagt. Jede ausgehende E-Mail wird von uns mit h?chster Sorgfalt auf Viren gepr?ft. Jedoch ?bernehmen weder BITO-Lagertechnik Bittmann GmbH noch der Absender (Patrick Hoffmann) die Haftung f?r Viren; es obliegt Ihrer Verantwortung, die E-Mail und deren Anh?nge auf Viren zu pr?fen.
>
> This email is exclusively meant for the addressee and may contain confidential information or information which can be classified as professional secret. Any view or opinion stated in this email is that of the author and does not necessarily represent the view or the opinion of BITO-Lagertechnik Bittmann GmbH. If you are not the addressee and if this email has been transmitted to you by mistake, you may not make use of, publish, transmit, reproduce or print the information contained therein for whatever purpose. We take every reasonable care to check all out-bound emails for viruses. However, neither BITO-Lagertechnik Bittmann GmbH nor the sender (Patrick Hoffmann) can be held liable for the occurrence of viruses and any consequential damages. It is therefore the addressee's sole responsibility to check incoming emails and attachments for viruses.
> *************************************************************************************
> Anh?nge:
> Versand am 04.03.2014 13:31 von Patrick Hoffmann
>
> _______________________________________________
> Devel mailing list
> Devel at owncloud.org
> http://mailman.owncloud.org/mailman/listinfo/devel
>
> _______________________________________________
> Devel mailing list
> Devel at owncloud.org
> http://mailman.owncloud.org/mailman/listinfo/devel



More information about the Devel mailing list