Announcement

Collapse
No announcement yet.

Ein Input mit Autocomplete manipulieren - Jquery

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ein Input mit Autocomplete manipulieren - Jquery

    Morgen Forum,

    ich möchte unseren FTP-Server gegen ein Owncloud 8.1.x ersetzen, wobei mich eigentlich nur stört, dass die Kunden auch untereinander teilen könnten. Bisher habe ich das Sharing deaktiviert und eine automatisches Teilen mit dem Manager beim Upload durch Modifizierung des Codes eingerichtet. So haben die Kunden sich nicht gesehen, aber unser Manager hat immer neue Kundendaten bekommen, ohne das der Kunde manuell Teilen musste. Ich würde diese Schritte gerne einsparen und einfach nur ein JS zusätzlich einbauen, dass beim Aufruf des Teilen-Buttons zwangsweise das Autocompletefeld mit dem "Namen des Managers" befüllt und auf readonly stellt, so muss der Kunde manuell teilen, aber die Updatefähigkeit des Systems bleibt bis auf ein kleines JS erhalten.

    Hier der Zustand des Share-Dropdowns zu Beginn
    HTML Code:
    <div id="dropdown" class="drop shareDropDown" data-item-type="file" data-item-source="32" data-item-source-name="medias.csv" style="">
    [...]      
    <input id="shareWith" type="text" placeholder="Mit Benutzern oder Gruppen teilen…" class="ui-autocomplete-input" autocomplete="off">
    [...]
    </div>
    Und hier mein Ansatz:
    HTML Code:
    $('.drop shareDropDown').each(function(){
    	if($(this).is(':visible')){
    		$('#shareWith .ui-autocomplete-input').val('admin');
    		$('#shareWith .ui-autocomplete-input').attr('readonly', true);
    		//$('#shareWith .ui-autocomplete-input').attr('autocomplete', true);
    	}
    });
    Gerne lasse ich mich auch von einer anderen Lösung überzeugen. Am liebsten würde ich den ganzen Dialog einsparen und nur auf "Teilen mit Admin" drücken. Danke für jede Hilfe...

    mfg
    Dominik

  • #2
    Es wäre schön, wenn du die Frage so formluieren könnstest, dass jemand, der von deiner Anwendung keine Ahnung hat das Problem verstehen kann (teilen? Manager? FTP?).
    Jedenfalls kannst du beim Druck auf einen Button eine Auswahl aus dem Dropdown vorgeben und dieses sperren.
    Selektieren:
    $('#dein_input').val("Wert");


    readonly:
    $('#dein_input').attr("disabled", true);
    Christian

    Comment


    • #3
      Bildschirmfoto 2015-09-11 um 09.34.30.jpg

      Hier mal ein Screenshot zur besseren Verständigung. Ich möchte also, dass die Auswahlmöglichkeit vollständig ausser Kraft gesetzt wird und immer der "admin" als Ziel eingetragen wird.

      HTML Code:
      //Das ist der Teilen Button
      <a href="#" class="action action-share" data-action="Share" original-title="">
          <img class="svg" alt="" src="/core/img/actions/share.svg"><span> Teilen</span>
      </a>
      
      // Das ist das o.a. Dropdown
      <div id="dropdown" class="drop shareDropDown" data-item-type="file" data-item-source="32" data-item-source-name="medias.csv" style="">
          <label for="shareWith" class="hidden-visually">Teilen</label>
          <input id="shareWith" type="text" placeholder="Mit Benutzern oder Gruppen teilen…" class="ui-autocomplete-input" autocomplete="off"><span role="status" aria-live="polite" class="ui-helper-hidden-accessible">[object Object]</span><span class="shareWithLoading icon-loading-small hidden"></span>
          <ul id="shareWithList"></ul>
          <div id="link" class="linkShare"><span class="icon-loading-small hidden"></span>
              <input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1">
              <label for="linkCheckbox">Link teilen</label>
              <br>
              <label for="linkText" class="hidden-visually">Link</label>
              <input id="linkText" type="text" readonly="readonly">
              <input type="checkbox" name="showPassword" id="showPassword" value="1" style="display:none;">
              <label for="showPassword" style="display:none;">Passwortschutz</label>
              <div id="linkPass">
                  <label for="linkPassText" class="hidden-visually">Passwort</label>
                  <input id="linkPassText" type="password" placeholder="Wählen Sie ein Passwort für den öffentlichen Link"><span class="icon-loading-small hidden"></span></div>
          </div>
          <div id="expiration">
              <input type="checkbox" name="expirationCheckbox" id="expirationCheckbox" value="1">
              <label for="expirationCheckbox">Setze ein Ablaufdatum</label>
              <label for="expirationDate" class="hidden-visually">Ablaufdatum</label>
              <input id="expirationDate" type="text" placeholder="Ablaufdatum" style="display:none; width:90%;"><em id="defaultExpireMessage"></em></div>
      </div>
      
      //so sieht meine Lösung gerade aus (ungetestet)
      $(".action action-share").click(function(){
      $('input#shareWith.ui-autocomplete-input>option:eq(admin)').prop('selected', true);
      $('input#shareWith.ui-autocomplete-input').attr('readonly', true); //disabled wäre doch ungeeignet, weil es das Versenden der Daten verhindert???
      });
      Danke, übrigens für die Unterstützung

      Comment


      • #4
        Hallo,
        Originally posted by lindo View Post
        ...Ich möchte also, dass die Auswahlmöglichkeit vollständig ausser Kraft gesetzt wird und immer der "admin" als Ziel eingetragen wird....
        Dann ersetze doch einfach die "Auswahlmöglichkeit" durch ein hidden-Feld mit dem "admin".

        Anmerkung: Alles was du im Frontend per HTML oder JS verbiegst ist nur Kosmetik, solange das Serverscript die ursprünglichen Operationen zulässt.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo,

          ich hatte erst jetzt die Möglichkeit zu antworten. Ich habe mich nun doch entschlossen, dass vorhandene JS von owncloud anzupassen. Diesmal mit der Prämisse, dass es schnell nachzubauen ist, bei Updates und Co. Ich dokumentiere hier mal meine Anpassungen, so wird sicherlich klar was ich eigentlich bezwecke und wer will kanns benutzen.

          Ich habe 2 Gruppen angelegt:
          1.) Admin mit dem Benutzer: admin (Datenempfänger -> immer teilen mit admin) //zuerst angelegt, damit er die UID 0 vom System bekommt
          2.) Kunden mit diversen Benutzern (Datensender und Empfänger)

          Ich habe, dass Sharing in den Einstellungen folgendermaßen eingestellt:
          prefs.jpg

          Das Ziel ist nun, dass alle Kunden ohne ihr zutun mit dem Admin teilen (direkt beim Upload). Sollte da mal was schief gehen, weil der Client genutzt wird, soll im Falle des Nicht-Teilens noch ein Button vorhanden sein, um das Ganze manuell auszulösen.

          kunde_03.jpg
          kunde_04.jpg

          Der Admin alleine kann, die Teilungen wieder aufheben und hat wenn er teilen will exklusiv das Echtzeit-Suchfeld mit allen Benutzern. Die Kunden haben selbst keine Auswahl und können sich somit auch nicht sehen.

          admin_01.jpg

          Hier jetzt mal der Code. Wer mir ne PN schickt, dem kann ich die Dateien direkt zukommen lassen:



          Zeile 192 ff. aus "owncloud/apps/files/ajax/upload.php"

          Grund: sofortiges Teilen mit Admin

          HTML Code:
          try {
              if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
          
                  // updated max file size after upload
                  $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
                  //neu Start
                  $currentUserId = \OCP\User::getDisplayName();
                  //neu Ende
          
                  $meta = \OC\Files\Filesystem::getFileInfo($target);
                  if ($meta === false) {
                      $error = $l->t('The target folder has been moved or deleted.');
                      $errorCode = 'targetnotfound';
                  } else {
                      $data = \OCA\Files\Helper::formatFileInfo($meta);
                      $data['status'] = 'success';
                      $data['originalname'] = $files['name'][$i];
                      $data['uploadMaxFilesize'] = $maxUploadFileSize;
                      $data['maxHumanFilesize'] = $maxHumanFileSize;
                      $data['permissions'] = $meta['permissions'] & $allowedPermissions;
                      $data['directory'] = $returnedDir;
                      $result[] = $data;
                      //neu Start
                      if ($currentUserId != 'admin') {
                      	//Wenn eine Datei hochgeladen wird, wird sie sogleich mit dem User "admin" geteilt
                          if (\OCP\Share::shareItem($data['type'], $data['id'], 0, 'admin', 3, $data['originalname'], null)) {
                              echo '<script>location.reload();</script>'; //erzw. Neuladen der Seite funktioniert noch nicht (weder JS noch PHP mt header)
                          }
                      }
                      //neu Ende
                  }
          
              } else {
                  $error = $l->t('Upload failed. Could not find uploaded file');
              }
          } catch (Exception $ex) {
              $error = $ex->getMessage();
          }
          Z. 408 ff. in der Funktion showDropdown aus "owncloud/core/js/share.js"

          Grund: andere Dropdown für Kunden und Admin
          ...hier verdoppel ich das vollständige JS mit einer Bedingung und modifiziere den Nicht-Admin-Teil. Das geht auch noch sauberer ;-)

          HTML Code:
          if (OC.currentUser !== 'admin') {
          
                    [...408]
                    var itemIsAlreadyShared = false;
          
                    $.each(data.shares, function (key, value) {
                        if (value.share_with_displayname === 'admin') {
                            itemIsAlreadyShared = true;
                        } else {
                            itemIsAlreadyShared = false;
                        }
                    });
          
                    html += '<label for="shareWith" class="hidden-visually">' + t('core', 'Share') + '</label>';
          
                    if (itemIsAlreadyShared === false) {
                        html += '<input id="shareWith" type="hidden" value="admin" />';
                        html += '<input id="shareWithButton" type="submit" value="Teilen" /> mit Linsen Druckcenter GmbH.';
                    } else {
                        html += '<input id="none" type="submit" value="geteilt" disabled="disabled" /> mit Linsen Druckcenter GmbH.';
                    }
          
                    [...]
          
                    die Select-Methode für das Dropdown ignoriere ich und füge noch folgende Methode hinzu, die auf Click reagiert:
          
                    $('#shareWithButton').click(function () {
                    event.stopPropagation();
                    var $dropDown = $('#dropdown');
                    var itemType = $dropDown.data('item-type');
                    var itemSource = $dropDown.data('item-source');
                    var itemSourceName = $dropDown.data('item-source-name');
                    var expirationDate = '';
                    if ( $('#expirationCheckbox').is(':checked') === true ) {
                        expirationDate = $( "#expirationDate" ).val();
                    }
                    var shareType = 0;
                    var shareWith = 'admin';
                    // Default permissions are Edit (CRUD) and Share
                    // Check if these permissions are possible
                    var permissions = OC.PERMISSION_READ;
                    if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
                        permissions = OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_READ;
                    } else {
                        if (possiblePermissions & OC.PERMISSION_UPDATE) {
                            permissions = permissions | OC.PERMISSION_UPDATE;
                        }
                        if (possiblePermissions & OC.PERMISSION_CREATE) {
                            permissions = permissions | OC.PERMISSION_CREATE;
                        }
                        if (possiblePermissions & OC.PERMISSION_DELETE) {
                            permissions = permissions | OC.PERMISSION_DELETE;
                        }
                        if (oc_appconfig.core.resharingAllowed && (possiblePermissions & OC.PERMISSION_SHARE)) {
                            permissions = permissions | OC.PERMISSION_SHARE;
                        }
                    }
          
                    OC.Share.share(itemType, itemSource, shareType, shareWith, permissions, itemSourceName, expirationDate, function () {
                        var posPermissions = possiblePermissions;
                        if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
                            posPermissions = permissions;
                        }
                        $('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares}));
                        OC.Share.updateIcon(itemType, itemSource);
                    location.reload();
                    });
                    return false;
                    });
          
          } else {
                    //original Code der Datei
          }
          Z. 614 ff. aus der Datei "owncloud/lib/private/share/share.php"

          Grund: da der Upload direkt teilen soll, stellt sich die Frage der Berechtigung zum Teilen für Nutzer nicht mehr

          HTML Code:
          if ($itemType === 'file' or $itemType === 'folder') {
            $path = \OC\Files\Filesystem::getPath($itemSource);
            // verify that the file exists before we try to share it
            if (!$path) {
              $message = 'Sharing %s failed, because the file does not exist';
              $message_t = $l->t('Sharing %s failed, because the file does not exist', array($itemSourceName));
              \OC_Log::write('OCP\Share', sprintf($message, $itemSourceName), \OC_Log::ERROR);
              throw new \Exception($message_t);
            }
            // verify that the user has share permission
            /*if (!\OC\Files\Filesystem::isSharable($path)) {
              $message = 'You are not allowed to share %s';
              $message_t = $l->t('You are not allowed to share %s', array($itemSourceName));
              \OC_Log::write('OCP\Share', sprintf($message, $itemSourceName), \OC_Log::ERROR);
              throw new \Exception($message_t);
            }*/
          }
          Grüsse Dominik

          Comment


          • #6
            Ach ja, eine Frage hätte ich dann doch noch...

            Im obersten Snippet der "upload.php" ist noch ein Kommentar:

            echo '<script>location.reload();</script>'; //erzw. Neuladen der Seite funktioniert noch nicht

            Weder mit JS noch mit PHP bekomme ich es hin, dass an dieser Stelle die Seite einmal neu geladen wird, somit erscheinen die neue Daten zunächst als nicht geteilt, obwohl sie es defakto sind. Will man dann Teilen bekommt man den Hinweis, dass die Datei schon geteilt ist - die Seite lädt neu und dann sieht man es auch schon.

            Wie könnte ich dort einen reload erzwingen???

            Danke und schönen Sonntag noch

            Comment


            • #7
              Hallo,

              steht denn dein
              HTML Code:
              <script>location.reload();</script>
              tatsächlich im erzeugten HTML-Code? Ggfs. liefert ja deine IF-Abfrage auf shareItem einfach false!?

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Guten Morgen,

                danke für den Tipp, denn genau da liegt der Hund begraben. Es handelt sich ja um einen AJAX Aufruf der upload.php, von woaus ich gar kein Neuladen der Seite erzwingen kann. Ich habe nun noch eine andere Datei gefunden: "apps/files/js/upload.js", die ich folgendermaßen geändert habe:

                HTML Code:
                function Upload(fileSelector) {
                    if ($.support.xhrFileUpload) {
                        var output = new XHRUpload(fileSelector.target.files);
                        OC.Share.loadIcons(); //neu
                        return output
                    } else {
                        var output = new FormUpload(fileSelector);
                        OC.Share.loadIcons(); //neu
                        return output
                    }
                }
                Upload.target = OC.filePath('files', 'ajax', 'upload.php');
                Das bringt aber nur 50% des erhofften Erfolgs, denn nur bei Drag n Drop wird die Datei sofort als "geteilt" angezeigt. Bei Nutzung des Dialogs wird, das Icon nicht geupdated, aber das Dropdown (s.o.) schon???

                Grüsse
                Dominik

                Comment

                Working...
                X